2011-11-19 100 views
0

我仍然試圖圍繞iphone內存管理。我已經檢查了這個漏洞,但我想確保。這是沒有泄漏?iphone內存管理和陣列

NSMutableArray *array = [[NSMUtableArray alloc] init]; 
NSMutableString *str = [[NSMutableString alloc]]; 

[str appendstring:@"hi"]; 

[array addObject:str]; 

[str release]; //this is the bit I am most concerned about 


...some processing of array occurs... 

[array release]; 
+0

可能沒有泄漏,但它不」編譯。 :) –

+1

缺少第2行的'init'?無論如何,似乎是無泄漏的。 – Ryan

+0

我的書中關於這個主題的章節可以免費在線獲得:http://www.apeth.com/iOSBook/ch12.html#_memory_management(當然,所有這些都會被重寫,以考慮到ARC) – matt

回答

4

假設你的第二行實際上是這樣的:

NSMutableString *str = [[NSMutableString alloc] init]; 

然後是的,這是無泄漏。當你將字符串添加到數組中時,數組會獲得字符串中的所有者權益,因此您對其擁有權的後續聲明沒有問題。它按預期仍然存在於數組中。

當你釋放數組時,它會負責清理它自己的引用,包括指向你放入它的字符串的引用。

1

憑經驗,你可能寫這個ON便條貼在你的辦公桌

如果頁頭,新,init或複製比你的老闆:)

你必須發佈它!沒有人會爲你清理。

**例:

NSString *releaseMeLaterPlease = [NSString initWithString....]; 

如果創建任何其他方式如實例假設 「袋」 是一些陣列,

NSString *dontReleaseMe = [bag objectAtIndex:0]; 
現在

,dontReleaseMe不創建通過alloc,new,init或copy,所以你不會釋放它們。有人會這樣做。


如果在alloc和init之後使用autorelease,操作系統將負責釋放它。


最重要的:現在,開發人員不必擔心這些東西! Hoooooray!自動引用計數是從iOS5的

不過這是好事,因爲學習不是所有的設備已經iOS5的:)

祝你好運!

0

quixoto回答了這個問題,但只是被明確起見,這裏發生了什麼事情對於內存管理代碼中的每一行:

NSMutableArray *array = [[NSMUtableArray alloc] init]; //array retain count = 1 
NSMutableString *str = [[NSMutableString alloc]]; //str retain count = 1 

[str appendstring:@"hi"]; 

[array addObject:str]; //str retain count = 2 

[str release]; //str retain count = 1 

...some processing of array occurs... 

[array release]; //array retain count = 0 & str retain count = 0 .. objects will be removed from memory.