我正在查看別人的代碼,並注意到他們在他們不擁有的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 = ?
代碼「工作」的原因是因爲NSString的-initWithString:識別傳入的字符串是一個常量字符串,因此不需要新的分配。由於常量字符串有效地忽略保留/釋放,因此代碼巧合地工作。 – bbum 2010-06-18 17:16:39