2009-04-25 59 views
2

這是一個示例代碼,其中只有「string」對象被釋放。爲什麼我不必釋放這些對象?

NSString *nameOfFile = ... ; 
NSError *error; 
NSString *string = [[NSString alloc] initWithContentsOfFile:nameOfFile encoding:NSUTF8StringEncoding error:&error]; 
if (string == nil) { 
    // handle error 
} 
[string release]; 

我明白爲什麼錯誤對象沒有被釋放。這是因爲這裏的方法沒有使用「new」或「alloc」方法創建該錯誤對象。相反,這個是通過引用返回的,所以initWithContentsOfFile方法負責這個內存。但是,nameOfFile對象呢?他們爲什麼不釋放它?它不是通過引用返回...?

回答

4

假設nameOfFile是一個常量字符串,則它自動保留計數爲7fffffff(即2147483647,最高可能的保留計數)。基本上,字符串文字在執行期間是持續的,並且永遠不會被釋放,所以您不應該擔心釋放它們。請記住,如果您保留了對象或爲其顯式分配了內存,則只需釋放該對象即可。

查看Apple's documentation瞭解更多信息。

+0

您需要用兩個「F」字在十六進制值,或十進制應該是2^23 - 1,而不是2^31 - 1。 – paxdiablo 2009-04-26 00:13:28

6

相似,爲什麼你不需要釋放error,你也不需要釋放nameOfFile。在Objective-C中,如果將一個字符串聲明爲NSString *temp = @"Hello",它將被視爲字符串常量,並且不需要釋放。內存引用計數爲零,因此不需要釋放。

相關問題