2011-07-11 47 views
4

我永遠無法取消分配我的NSMutableString,如下所示。初始保留計數應該爲1,但釋放幾次後,字符串仍然可用,就像沒有任何事情發生!爲什麼我的對象在無數次發佈後仍然工作?

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // insert code here... 
    NSMutableString* s = [[NSString alloc]initWithString:@"AAA"]; 
    [s release]; 
    [s release]; 
    [s release]; 
    [s release]; 
    [s release]; 

    NSLog(@"%@",s); 

    [pool drain]; 
    return 0; 
} 

當然,如果我使用分析它仍然告訴我,我鬆開第二release一個釋放的對象。

回答

8

釋放物體告訴它可以銷燬對象,至少至於您擔心的運行,但它不會要求該對象被立即銷燬:你的第一個[s release],可可後可以隨意使用以前由s使用的內存。它可能會將該內存給予執行alloc的下一個對象,在這種情況下,稍後嘗試訪問s將導致運行時崩潰......或者它可能不需要立即存儲內存,在這種情況下,您可能會無法訪問一個發佈的對象。

經驗法則不是「我釋放了這個對象,這意味着它不再存在」,更多「我釋放了這個對象,這意味着它不再保證存在。」

9

Scott的答案是正確的答案,但在這種特殊情況下,原因是NSString文字(即@「」)是唯一的編譯時常量,在保留和釋放時實際上並沒有做任何事情。你將它賦值給一個NSMutableString *實際上並不會使它成爲一個NSMutableString,所以你寫的東西相當於

[@"AAA" release]; 
[@"AAA" release];  
[@"AAA" release]; 
[@"AAA" release]; 
[@"AAA" release]; 
[@"AAA" release]; 
相關問題