【问题标题】:Clarification for ARC code in Apple sampleApple 示例中的 ARC 代码说明
【发布时间】:2014-02-28 01:46:09
【问题描述】:

标准 Xcode 5 OpenGLES 模板示例创建一个应用程序,其中包括以下作为着色器加载代码的一部分:

const GLchar *source;

source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String]; // load file

...

glShaderSource(*shader, 1, &source, NULL);

经过Clang LLVM ARC 之后,我预计从文件内容创建的 NSString 对象“在包含它的完整表达式的末尾被释放”。 但是,然后在NSString.h 中将UTF8String 方法声明为:

- (__strong const char *)UTF8String;

这是否意味着 ARC 足够聪明,可以确定应该保留 NSString 对象,直到 source 超出范围?还是我偏离了轨道?

【问题讨论】:

    标签: ios objective-c automatic-ref-counting clang


    【解决方案1】:

    [NSString stringWithContentsOfFile] 返回一个autoreleased 对象,这意味着它在下一次运行循环之前是活动的,即在当前方法退出之后

    【讨论】:

    • 啊,谢谢!这是我遗漏的一点:“需要注意的是(再次按照惯例)所有对象创建类方法都返回一个自动释放的对象。” stackoverflow.com/questions/6578
    【解决方案2】:

    在当前 Xcode 5.0.02/Clang 4.2 编译器中UTF8String 被声明为:

    - (__strong const char *)UTF8String NS_RETURNS_INNER_POINTER;
    

    这表明它的返回值是一个非引用计数指针进入它所应用的对象,ARC 将根据需要延长该对象的寿命以保持指针有效。请参阅您引用的同一参考文献的Interior Pointers 部分。所以你的问题的答案:

    这是否意味着 ARC 足够聪明,可以确定应该保留 NSString 对象,直到源超出范围?

    是的,只要它指定的属性 - 它自己无法弄清楚那个部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多