我想知道如果autorelease池擁有對它擁有的對象的強或弱引用。我猜他們很弱。當我將一個對象添加到自動釋放池時,它不會立即釋放,但會在池被耗盡時釋放,對吧?所以引用應該很弱,即當我將一個對象添加到自動釋放池時引用計數(或保留計數)保持不變?如何引用autorelease池中的對象?
回答
是的。保持數保持不變,並且可以喲可以檢查,它是這樣:
id obj = [[NSObject alloc]init];
NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
[obj autorelease];
NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
autorelease池的全部意義在於,它是一個延遲釋放。例如,你可以調用一個本地對象上的autorelease,這個對象將在一個方法中返回,這樣即使在方法返回時你失去了對象的引用,它也會被釋放。
強談到與弱引用使得垃圾回收的內存管理環境(其中弱指針被自動釋放,即使引用清零)的背景意義。啓用GC後,所有保留/釋放/自動釋放調用本質上不做任何操作(儘管NSAutoreleasePool -drain方法觸發垃圾回收)。
現在既然你已經標記爲與iPhone相關的這個問題,而且也對iPhone沒有垃圾收集,我假設你指的是經常引用計數,通過強大的你的意思是增加保留引用對象的數量,而弱者則意味着只存儲指針值。
autorelease
方法本質上將對象的所有權從調用代碼移動到當前自動釋放池,您可以考慮調用代碼調用釋放和調用保留池。
因此,該引用非常有效,但是您的代碼失去了所有權並釋放了責任。對象release
將在autorelease池被釋放/耗盡時被調用。
保留計數保持不變,基本上射擊的對象上一個自動釋放消息使開發人員能夠自由從具有所有權和釋放的責任。
這就是自動釋放池的工作原理 - 每次創建自動釋放池的實例時,都會將其添加到堆棧的頂部,因此係統會使用最近的自動釋放池。每當你在autorelease池中添加任何對象時,它都會被添加到堆棧中的頂層autorelease池中。自動釋放池基本上是一個數組,在其上添加自動釋放對象。當釋放(/排空)特定的自動釋放池時,每個添加到自動釋放池中的對象都會被釋放。在系統開始處理任何事件之前,首先創建一個自動釋放池,並且它會一直存在,直到當前事件循環的執行結束。當系統看到當前事件循環已完成時,它將獲得與該事件循環關聯的最高級別自動釋放池並將其釋放。釋放自動釋放池/釋放意味着將每個對象添加到自動釋放池中,並在對象上釋放釋放消息,直到釋放自動釋放池中的所有對象。
- 1. 在Objective-C中如何處理Autorelease池中的對象?
- 2. NSOperation和Autorelease池
- 3. 如何用autorelease消息找到對象?
- 4. Autorelease Pool中的對象數
- 5. 爲什麼__weak對象會被添加到autorelease池中?
- 6. 爲什麼我的對象不是由autorelease池收集的?
- 7. autorelease池的工作流程
- 8. __在Xcode 4.2中的ARC和autorelease池
- 9. 誰擁有autorelease對象?
- 10. 如何清除池中的對象?
- 11. 使用蘋果autorelease池沒有Objective-C
- 12. iPhone:在自定義Autorelease池中崩潰
- 13. 對象池或通過引用無狀態對象
- 14. 如何在Spring中管理對象池?
- 15. c#中的對象池由asp.net,.Net引用的dll 4.5.1
- 16. dbcp Servlet中的對象池
- 17. 如何引用VBA中的HTMLSelect對象?
- 18. 對象池vs連接池
- 19. Andengine - 對象池或通用池優化
- 20. 對象池:HOWTO
- 21. Unity 5 - 對象池不禁用對象
- 22. 當我們在Autorelease池中編寫[Obj autorelease]時會發生什麼?
- 23. 如何從對象引用
- 24. iOS - 對象發送autorelease太多次
- 25. Cocos2D iPhone - 對象發送過多次autorelease?
- 26. 什麼時候發佈「autorelease」對象?
- 27. 對象發送-autorelease太多次
- 28. 如果我正在使用GCD,我應該創建@autorelease池
- 29. 如何在引用基類對象的向量中引用派生對象?
- 30. 如何在PHP中引用XML對象內的XML對象?