Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 苹果样品中ARC代码的澄清_Ios_Objective C_Automatic Ref Counting_Clang - Fatal编程技术网

Ios 苹果样品中ARC代码的澄清

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,

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

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对象应该保留,直到源超出范围


是的,只要它指定了属性,它就无法识别该部分本身。

啊,谢谢!这里是我遗漏的一点:“需要注意的是(按照惯例)所有对象创建类方法都返回一个自动释放的对象。”啊,谢谢!这里是我遗漏的一点:“需要注意的是(按照惯例)所有对象创建类方法都返回一个自动释放的对象。”