![](/img/trans.png)
[英]Is it okay for multiple objects to retain the same object in Objective-C/Cocoa?
[英]Question about factory method object lifetimes in Objective-C/Cocoa (to retain or not…)
通過閱讀SDK中的內存管理文檔,我收集了工廠方法(靜態構造方法)通常會為我保留對象並將其添加到自動釋放池中?
這意味着只要池在我預期之前沒有被釋放,我就不需要保留和釋放對象了嗎? (應該在應用程序的末尾,對於main()中的默認自動釋放池?)
這個問題: 可可觸摸問題。 應保留[NSMutableArray數組]嗎? 似乎同意這一點。
但是,當我使用NSMutableArray arrayWithCapacity:方法時,我發現我必須保留數組或所有heck松散。
我確信這只是總計n00b-ness,或代碼中其他地方的一個奇怪的錯誤,但如果有人能夠解釋我究竟是怎么會誤解,我會非常感激。
謝謝!
更新:感謝您的回答。 我想我現在已經有了!
通過閱讀SDK中的內存管理文檔,我收集了工廠方法(靜態構造方法)通常會為我保留對象並將其添加到自動釋放池中?
是的,除了alloc
, init
, new
和copy
方法之外,您不必擔心釋放從任何方法返回的對象。
這意味着只要池在我預期之前沒有被釋放,我就不需要保留和釋放對象了嗎?
是。
(應該在應用程序的末尾,對於main()中的默認自動釋放池?)
不可以。只有在你從任何方法或函數返回時才能依賴周圍的對象。通常,當控制返回到運行循環時,自動釋放池會被刷新。
如果您希望對象實例超越當前方法,則必須通過調用“retain”來獲取它的所有權。 然后,當您不再需要時,您還負責“釋放”該實例。
在你的情況下,如果你想要你的NSMutableArray,你需要retain
它。 更好的是,使用[[NSMutableArray alloc] initWithCapacity: ];
請參閱實用內存管理
通常,自動釋放池在當前事件循環結束時耗盡。 一個非常好的經驗法則是,除非你要返回一個自動釋放的對象,否則如果你希望該對象保持在當前方法之外,你應該保留它。
因此,當您將NSMutableArray創建為自動釋放對象時,一旦您的方法結束,所有投注都將關閉,並且該自動釋放池可能隨時消耗。 保留它,然后在你的dealloc中釋放它。
查看下圖,解釋應用程序生命周期 。 應用程序啟動后,您的應用程序將處理用戶生成的各種事件,例如觸摸,網絡活動或許多事件之一。 處理完事件后,控制權將返回到您在下面看到的Event Loop
。
此事件循環維護頂級自動釋放池。 在偽代碼中,此事件循環看起來像:
while(wait for event) {
1) create autorelease pool
2) handle event
3) release pool
}
因此,無論何時處理事件,控制都會返回主事件循環,並且將釋放此外部池。 您應該保留使用便捷方法創建的所有對象,即使在事件處理完成后也需要這些對象。 通過額外的保留計數,您獲得對象的所有權,並負責在不再需要時釋放它。
只要將對象添加到數組中,就會有一個隱式調用來保留此對象,這意味着一旦添加到數組中,您就可以從源中釋放它,並且當您從數組中調用remove方法時也將是一個隱含的釋放呼吁。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.