似乎自動引用計數(ARC)給開發人員帶來了太多的負擔以跟蹤引用。你爲什麼不能讓每個變量都變弱,而不必擔心發生強烈的保留週期?即使不需要使用弱變量的缺點?
回答
我怕你只是不理解ARC。 ARC根據是否定義爲強或弱定義了引用計數(實際上,強引用計數增大,而弱引用計數不定)。如果引用計數變爲0,它將從內存中移除。所以,如果一切都很弱,屬性會立即從內存中刪除,而你不能使用它們。實際上,你需要一個強壯的地方。
作爲計劃如何構建強/弱定義的一種簡單方法,可以將一個特定的類視爲屬性的所有者,然後給它一個強大的屬性。這意味着該財產將繼續爲該所有者使用。如果另一個階級也有對該財產的引用,但並不要求該財產始終堅持它 - 使之變弱。只要主要所有者類,比如說視圖控制器,仍然存在 - 那麼屬性也是如此。如果兩者都被設置爲弱,那麼即使該屬性仍然出現,它仍然是空的,因爲在運行時,確定沒有人真的需要它,並且它被刪除。
只要至少有一個對該對象實例的強引用,ARC對象實例就處於活動狀態。
如果您將所有變量標記爲弱,則不會有強引用的對象實例,也不會有任何可以使其保持活動狀態。它會在創建後立即銷燬。
如果您對對象實例採取的不止一次引用,您必須考慮是否應將其標記爲弱或強(取決於特定的代碼),這是無法解決的。
這是因爲只要需要引用對象,只要需要引用的對象在內存中生存,就需要一個強引用。
(你可以回去的Objective-C,你可以手動執行,而不ARC所有作品,並做內存管理你自己的。顯然,這可以讓你欣賞ARC)
在另一方面,你可以問同樣的問題以獲得有力的參考。不同的是,當你只保留強引用(沒有弱引用)時,你不必考慮弱或強,它會起作用。 (弱單獨將很可能不起作用) 但是,然後你必須100%肯定爲你不再需要的每個對象的每個強引用都是空的。
附註: 當您將對象添加到集合(如數組或集合)時(或作爲視圖的子視圖),那麼這些集合對象將爲您保留強引用。在這種情況下,您不必關心,但可以丟棄該對象時從該集合中刪除該對象。這個「竅門」只有在你維護這些藏品時才適用 - 例如當它是關於作爲視圖層次的一部分的視圖時,只要它們是必需的。
- 1. 我需要在OCAML中使用缺點
- 2. 在不需要時使用requestAnimationFrame的缺點
- 3. 在塊內分配一個變量需要弱引用?
- 4. Swift函數變量需要弱引用嗎?
- 5. Javascript Sendgrid錯誤缺少變量需要
- 6. 需要使用變量在另一頁
- 7. 需要幫助使用變量,蟒蛇
- 8. 我需要幫助使用變量
- 9. Gitosis需要使用即使公鑰給
- 10. Boto3缺少必需的列「重點」,即使設定錯誤
- 11. 使用Boost Python與弱點?
- 12. Makefile:需要明確混合使用環境變量和變量
- 13. 靜態變量不需要
- 14. 即使不需要,Android Studio是否也使用appcompat v7?
- 15. Kivy Python - 無需使用NumericProperty即可增加變量的按鈕
- 16. 我需要重構這個類而不使用實例變量
- 17. 使用不可變列表是否需要大量內存?
- 18. PhantomJS「找不到變量:需要」使用PhantomJasmine時
- 19. 使用全局變量的缺省值
- 20. Windows Phone,垃圾收集器不要清理視圖,即使只有弱引用
- 21. 要求用戶使用Facebook登錄站點的優點/缺點
- 22. 的Node.js看來,即使在需要它們被收集私有變量
- 23. PHP錯誤:缺少參數1,即使我傳遞變量
- 24. 需要JDBC,但不需要使用jdbc
- 25. AngularJS ng-要求不能使用變量
- 26. F#需要重寫代碼才能不需要可變變量
- 27. 私有變量的優點/缺點?
- 28. 即使不使用@也不能總是訪問實例變量的值,即使使用attr_accessor
- 29. 需要使用def語句創建代碼? &不能使用全局變量
- 30. 我不需要使用session_start()來使用會話全局變量嗎?
它可能會讓你感到驚訝,但是ARC使這個*更容易*,而不是更難! :) –
關掉ARC,看看你是否可以學習做內存管理。可能要先閱讀本書的這一章:http://www.apeth.com/iOSBook/ch12.html#_principles_of_cocoa_memory_management – matt
垃圾收集(GC)非常方便;) – TruMan1