标准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对象?还是我偏离轨道?
答案 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对象应该保留,直到源超出范围?
是的,只要它指定的属性 - 它就无法自己计算出那个部分。