澄清Apple样本中的ARC代码

时间:2014-02-28 01:46:10

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

标准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足够聪明,可以确定在source超出范围之前应保留NSString对象?还是我偏离轨道?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

- (__strong const char *)UTF8String NS_RETURNS_INNER_POINTER;

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

  

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

是的,只要它指定的属性 - 它就无法自己计算出那个部分。