2014-02-28 110 views
0

標準的Xcode 5個OpenGLES模板實例創建包括以下內容的應用程序作爲所述着色器加載代碼的一部分:澄清蘋果樣品中ARC代碼

const GLchar *source; 

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

... 

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

通過Clang LLVM ARC涉水後,我會預期的NSString從文件內容創建的對象「在包含它的完整表達式的末尾釋放」。 然而,然後UTF8字符串方法在NSString.h爲聲明:

- (__strong const char *)UTF8String; 

這是否意味着ARC是足夠聰明弄清楚,NSString的對象應該被保留,直到source超出範圍?或者我偏離軌道?

回答

2

[NSString stringWithContentsOfFile]返回autoreleased對象,這意味着它是活的,直到下一個runloop即當前方法退出

+0

唉謝謝!以下是我錯過的一點:「重要的是要注意的是(同樣,按照慣例)所有對象創建類方法都會返回一個自動釋放對象。」 http://stackoverflow.com/questions/6578/ – bw1024

2

後在當前的Xcode 5.0.02 /鏘4.2編譯UTF8String被聲明爲:

- (__strong const char *)UTF8String NS_RETURNS_INNER_POINTER; 

這表明它的返回值是一個非參考計數指針轉換爲它應用於的對象,ARC將根據需要延長該對象的生命期以保持指針有效。請參閱您引用的同一參考文獻的Interior Pointers部分。所以你的問題的答案:

這是否意味着ARC足夠聰明,以確定NSString對象應保留,直到源超出範圍?

是肯定的,只要它指定的屬性 - 它不能指出它自己的部分。