簡體   English   中英

關於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中的內存管理文檔,我收集了工廠方法(靜態構造方法)通常會為我保留對象並將其添加到自動釋放池中?

是的,除了allocinitnewcopy方法之外,您不必擔心釋放從任何方法返回的對象。

這意味着只要池在我預期之前沒有被釋放,我就不需要保留和釋放對象了嗎?

是。

(應該在應用程序的末尾,對於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
}

因此,無論何時處理事件,控制都會返回主事件循環,並且將釋放此外部池。 您應該保留使用便捷方法創建的所有對象,即使在事件處理完成后也需要這些對象。 通過額外的保留計數,您獲得對象的所有權,並負責在不再需要時釋放它。

iPhone應用程序http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Art/app_life_cycle.jpg

只要將對象添加到數組中,就會有一個隱式調用來保留此對象,這意味着一旦添加到數組中,您就可以從源中釋放它,並且當您從數組中調用remove方法時也將是一個隱含的釋放呼吁。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM