當我應該使用保留和分配時,有沒有什麼好的規則可以學習?如何知道我是否需要保留或分配房產?
33
A
回答
4
我會認爲,在處理對象時,您幾乎總是使用retain而不是assign,並且在處理基本類型,結構等時,您將使用assign(因爲您不能保留非對象)。那是因爲你想讓屬性的對象決定何時完成對象,而不是別的。 Apple的內存管理指南指出:
有時您不希望 收到的對象被丟棄;對於 示例,您可能需要將 對象緩存在實例變量中。在 這種情況下,只有當您知道何時不再需要對象 ,所以您需要 需要電源才能確保 對象未被丟棄,而您的 仍在使用它。你這樣做了 保留的消息,它可以停留未決自動釋放的效果 (或搶佔 後來釋放或自動釋放 消息)。通過保持一個對象,你 確保它不會被釋放 ,直到你用它做。
有關使用副本vs保留的討論,請參閱this SO question。
0
如果您打算保留該對象,並使用它,使用保留。否則,它可能會被釋放,最終會出現代碼錯誤。
53
分配爲像BOOL,NSInteger的或雙原始值。對於使用保留或複製的對象,取決於您是要保留對原始對象的引用還是複製該對象。
唯一相同的例外是弱引用,要一個指針保持一個對象,但不能保留它,因爲參考週期。這方面的一個例子就是委託模式,其中一個對象(例如一個表格視圖)保存一個指向其委託的指針。由於委託對象保留了表視圖,因此讓表視圖保留委託將意味着任何一個都不會被釋放。在這種情況下使用弱引用。在這種情況下,您可以在創建財產時使用分配。
4
我知道這是一個古老的問題,但我發現這些指導從超級大師馬特加拉格爾,超級有用:http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html。在我的情況下,我有一個「保留地獄」我自己製作一個難引用一個父對象。下面
相關問題
- 1. 如何知道我是否需要XDocument或XElement?
- 2. 我如何知道我是否需要更多實例?
- 3. 保留容量是否會產生兩個分配或只有一個分配?
- 4. Xcode字體:如何知道我是否需要購買LISCE?
- 5. 如何知道我是否需要使用Markdown庫?
- 6. 我如何知道平臺項目是否也需要NuGet包
- 7. 我如何知道用戶是否按f5或不要處理
- 8. Rails是否需要保留json.jbuilder文件
- 9. 打包後是否需要保留data.fs.old?
- 10. 如果我需要保存Backbone.Collection,它是否是代碼味道?
- 11. 如何知道python我需要小數?
- 12. 我需要知道如何使用string.maketrans
- 13. 如何知道我需要哪個RedirectToAction?
- 14. 我是否需要釋放我不保留的對象?
- 15. 如何知道已分離的JPA實體是否已被保留?
- 16. twitter4J我不知道我是否需要acount
- 17. 我需要知道我是否正確使用getline
- 18. 如何知道模塊是否需要RankNTypes或ExistentialTypes(如果未明確提及)?
- 19. 保留週期,弱房地產
- 20. 我如何知道我的應用程序中是否需要「WCF HTTP激活」?
- 21. style.clip爲空 - 需要知道部分div是否可見
- 22. 我如何知道CPU是否是Haswell或不是
- 23. 如何知道InnoSetup腳本是否需要重新啓動?
- 24. 如何知道圖像是否需要縮小?
- 25. 如何知道代碼是否需要eval()
- 26. 如何知道mongodb是否需要驗證?
- 27. Yodlee:在刷新之前如何知道是否需要MFA
- 28. TPL如何知道線程是否需要更多工作?
- 29. 我是否需要保留對FileSystemWatcher的引用?
- 30. 我是否需要保留自動釋放對象?
出色答卷。如果你可以將其中一個標記爲已接受,那將會很棒 – memmons 2011-11-07 23:39:32