2010-06-18 49 views
5

我正在查看別人的代碼,並注意到他們在他們不擁有的NSString上調用'release'(從未在任何地方調用alloc/retain/copy並且它不是屬性)。調用'release'太多次了?

這對我來說看起來有點奇怪,它讓我想知道如果你對一個你不是'擁有'或者其引用計數已經是0的對象調用'release'會不會發生奇怪的行爲?下面的代碼編譯/運行良好沒有警告,所以我猜沒有問題,但我只是好奇。

// Releasing an object I don't own 
NSString *notMyString = [NSString stringWithString:@"Not mine."]; 
[notMyString release]; // Ignored? 

// Releasing an object I own, twice 
NSString *myString = [[NSString alloc] initWithString:@"Mine."]; 
[myString release]; // Ref count = 0 
[myString release]; // Ref count = ? 
+2

代碼「工作」的原因是因爲NSString的-initWithString:識別傳入的字符串是一個常量字符串,因此不需要新的分配。由於常量字符串有效地忽略保留/釋放,因此代碼巧合地工作。 – bbum 2010-06-18 17:16:39

回答

15

是的,不要那樣做。您的評估是正確的,您對所有權規則的理解也是正確的。向已經發布的對象發送消息具有未定義的行爲 - 有時你會因爲其他事情發生而幸運,並且什麼都不會發生。有時你會立即崩潰,有時候會因爲你損壞了別的東西而崩潰。

+2

是的,這是我所擔心的長期行爲。猜猜你不能總是相信隨機博客'教程'代碼as-is =)。感謝你及時的答覆。 – nebs 2010-06-18 16:18:32

相關問題