2011-11-16 61 views
1

可能重複:
Is it better to autorelease or release right after?另一個iOS的內存管理澄清自動釋放/發佈使用

(向前通知:請不要在ARC方面討論這個話題)

我們公司內部有一場辯論,主題是autorelease/early-release的用法。讓我解釋一下。

方案1:

NSArray *tempArray = [[NSArray alloc] init]; 
self.myRetainingProperty = tempArray; 
[tempArray release]; 

方案2:

self.myRetainingProperty = [NSArray array]; // or [[[NSArray alloc] init] autorelease]; 

基本上這兩種情況都完全沒問題,但我會好奇,什麼是社區化的方式使用這些場景?我更傾向於「儘快發佈」(場景1) - 特別是在iOS可能很珍貴的內存中,但另一方面是一個自動發佈的對象(場景2),直到下一個runloop週期不會放太多強調內存佔用。

所以我的問題是你更喜歡哪一個,或者是否有Apple推薦的方法?

再一次:請讓我們忽略ARC的時刻:) ...

感謝。

+1

我們是否也可以忽視這兩個例子都是毫無意義的,因爲它們創建了一個不可變的空數組? ;) – jrturton

+1

一噸的問題 - http://stackoverflow.com/search?q=release+vs+autorelease – beryllium

回答

0

它不是經常使用這個不可變的對象,但對於NSMutableArray它是一個不同的東西。

NSMutableArray *myList = [[NSMutablearray alloc] init]; 
Someobject *myObject = [[Someobject alloc] init]; 
[myList addObject:myObject]; 
[myObject release]; 
[self setList:myList]; 
[myList release]; 

我經常像上面那樣使用它。在iPhone/iPad上,當您的內存量有限時,我認爲儘快清理未使用的內存是個很好的習慣。當沒有其他選項可用時,我只使用autorelease。

-1

基本上,這只是一個內存管理問題:-)和性能。

如果你正在分配一個簡單的對象,autorelease應該沒問題。我猜想1 K的記憶不應該是你的應用程序的批評。

但是......如果你分配一個佔用大量內存的對象,或者分配許多需要一些內存的對象,例如在一個循環中,你會被建議儘快釋放它們。如果沒有,您可能會遇到性能問題,並且在最好的情況下,應用程序的didReceiveMemoryWarning方法(及其後果)將更頻繁地調用。

一切都取決於你想要什麼樣的優化:優化應用程序...或者如果你是運行循環內進行很多次,然後提前釋放優化開發:-)

-1

最好防止建立一個大的自動釋放池。否則,它沒有任何區別,並歸結於個人偏好。

我個人在早期發佈陣營,如果只是爲了避免嵌套太多的方括號。

1

至於內存使用情況相同。唯一的區別是Autorelease池的大小。當你將它們分配給一個屬性時,當你的release它不會被釋放,因爲內存區別的差異將是在autorelease池中存儲一個條目。自動釋放池中有一些開銷,但在這種情況下通常可以忽略不計。你應該做一些自然而然的事情,並且讓代碼易於閱讀/維護。