2011-06-07 63 views
0

請注意下面的註釋[printvolfirst release];一行。如果我不評論它,程序崩潰。我無法弄清楚爲什麼。 printvolfirst變量除了在這裏看到的代碼行之外不在其他任何地方使用。在它被分配到後,我完成了它。那麼爲什麼不發佈它呢?釋放我完成的NSString導致崩潰

vol = vol/1000000; 
NSNumberFormatter * format = [[NSNumberFormatter alloc] init] ; 
[format setPositiveFormat:@"#.#"]; 
NSString * printvolfirst = [[NSString alloc]init]; 
printvolfirst = [format stringFromNumber:[NSNumber numberWithFloat:vol]]; 

NSString * printvol = [[NSString alloc] initWithFormat: @"%@M", printvolfirst]; 

self.Pop.vol.text = printvol; 
[printvol release]; 
//[printvolfirst release]; 
[format release]; 

回答

3

stringFromNumber: autoreleases返回的對象。如果您再次釋放它,它會在釋放後釋放。

事實上,你甚至不需要驗證碼:

NSString*printvolfirst=[[NSString alloc]init]; 

您可以在生成設置在「運行靜態分析儀」匝弄警告這樣的事情。

+0

有趣。我認爲我「擁有」這個變量,如果我直接使用alloc/init,並且我擁有它直到我釋放它。不對?如果我想保留printvolfirst而不是autorelease,我該怎麼做? – johnbakers 2011-06-07 19:50:28

+1

你可以通過發送'retain'消息來保留它。確實,當你「分配」,「保留」或「複製」一個對象時,你擁有它。但是你正在做的是分配一個對象,然後將它設置爲一個新對象,立即引入內存泄漏。如果啓用分析儀,它應該完全告訴你你做錯了什麼。 :) – 2011-06-07 19:51:42

+2

@andrewjs:你缺少的關鍵是你不擁有*變量* - 你擁有*對象*。您最初爲該變量分配一個空字符串(您自己擁有),然後將該字符串丟棄並分配'stringFromNumber:'(您不擁有)的結果。這是兩個不同的對象。將它們存儲在同一個變量中並不會改變它們的內存管理要求。 – Chuck 2011-06-07 20:15:33

1

您正在釋放autorelease d字符串。雖然您正在執行NSString*printvolfirst=[[NSString alloc]init];,但是當您執行printvolfirst=[format stringFromNumber:[NSNumber numberWithFloat:vol]];時,您將丟失對該對象的引用,您將自動釋放對象分配給printvolfirst。在這個過程中,你也創建了一個內存泄漏。你不必釋放它。