Ios 苹果样品中ARC代码的澄清
标准Xcode 5 OpenGLES模板示例创建了一个应用程序,其中包含以下内容作为着色器加载代码的一部分:Ios 苹果样品中ARC代码的澄清,ios,objective-c,automatic-ref-counting,clang,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,
const GLchar *source;
source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String]; // load file
...
glShaderSource(*shader, 1, &source, NULL);
在仔细阅读之后,我希望从文件内容创建的NSString对象“在包含它的完整表达式的末尾被释放”。
但是,UTF8String方法在NSString.h
中声明为:
- (__strong const char *)UTF8String;
这是否意味着ARC足够聪明,可以知道NSString对象应该保留到
source
超出范围为止?还是我偏离了轨道?[NSString stringWithContentsOfFile]
返回一个自动删除的对象,这意味着它在下一次运行循环之前(即当前方法退出后)是活动的[NSString stringWithContentsOfFile]
返回一个自动删除的
对象,这意味着在当前Xcode 5.0.02/Clang 4.2编译器UTF8String
中的当前方法退出后,它将一直处于活动状态,直到下一个runloop被声明为:
- (__strong const char *)UTF8String NS_RETURNS_INNER_POINTER;
这表明它的返回值是指向应用它的对象的非引用计数指针,ARC将根据需要延长该对象的寿命以保持指针有效。请参阅您引用的同一参考资料的部分。那么你的问题的答案是:
这是否意味着ARC足够聪明,能够理解NSString对象应该保留,直到源超出范围
是“是”,只要它指定了属性,它就无法计算出该部分本身。在当前的Xcode 5.0.02/Clang 4.2编译器UTF8String
中声明为:
- (__strong const char *)UTF8String NS_RETURNS_INNER_POINTER;
这表明它的返回值是指向应用它的对象的非引用计数指针,ARC将根据需要延长该对象的寿命以保持指针有效。请参阅您引用的同一参考资料的部分。那么你的问题的答案是:
这是否意味着ARC足够聪明,能够理解NSString对象应该保留,直到源超出范围
是的,只要它指定了属性,它就无法识别该部分本身。啊,谢谢!这里是我遗漏的一点:“需要注意的是(按照惯例)所有对象创建类方法都返回一个自动释放的对象。”啊,谢谢!这里是我遗漏的一点:“需要注意的是(按照惯例)所有对象创建类方法都返回一个自动释放的对象。”