所有Objective-C的起始頁面與主函數聲明下一個默認@autoreleasepool{...}
語句打開。但是這個聲明實際上在做什麼?新的Objective-C自動釋放對象並刪除行對程序沒有任何影響。這個命令真的有必要嗎?
回答
@autoreleasepool
聲明與以前一樣執行相同的工作,而不是使用NSAutoreleasePool類。 NSAutoreleasePool的工作方式有點奇怪,因爲創建它會在整個應用程序中產生效果; @autoreleasepool
創建一個有作用域的區域,並使其更清楚池中的內容以及何時消耗(當它超出範圍時)。根據蘋果的說法,它也更有效率。
自動釋放池的概念非常簡單,只要對象實例標記爲自動釋放(例如NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];
),它在該時刻的保留計數就是+1,但是在運行循環結束時,該池被排空,並且任何標記爲autorelease的對象的保留計數遞減。這是一種在你準備任何可以保留它自己的東西時保持物體的一種方式。
使用ARC,開發人員不使用autorelease
關鍵字,管理ARC的基礎系統會爲您插入該關鍵字。 (記住:所有ARC正在插入retain
,release
和autorelease
在適當的時間要求您)。正因爲如此,現有的AutoreleasePool概念需要停留在周圍。
如果刪除了自動釋放池,你的對象將開始泄漏
在引用計數的環境,可可希望那裏是一個自動釋放池始終可用。如果池不可用,則自動釋放的對象不會釋放,並且會泄漏內存。在這種情況下,您的程序通常會記錄適當的警告消息。
這是否意味着,如果我使用ARC並從''@autoreleasepool {}之外的某處釋放對象,該對象仍然存在,直到@autoreleasepool塊的結尾? – confile
如果您手動釋放自動釋放對象,則當您點擊自動釋放池的末尾時,釋放的對象將不再存在,並且您可能會在框架或機器代碼中的某處發生異常。如果這是一段漫長的代碼,你的應用程序似乎會在一個看似無關的位置崩潰,造成混亂。 – jcpennypincher
- 1. 爲什麼@autoreleasepool?
- 2. @autoreleasepool做什麼?
- 3. 爲什麼@autoreleasepool不起作用
- 4. 爲什麼Xcode 4.2在main.m中使用@autoreleasepool而不是NSAutoreleasePool?
- 5. 什麼是從autoreleasepool塊內設置NSError outparam的正確方法?
- 6. 與autoreleasepool
- 7. @autoreleasepool EXC_BAD_ACCESS
- 8. @autoreleasepool循環或循環在@autoreleasepool?
- 9. @autoreleasepool in ios 5
- 10. @autoreleasepool沒有ARC?
- 11. Runloop和autoreleasePool
- 12. @autoreleasepool犯錯誤
- 13. Objective-C @autoreleasepool?
- 14. @autoreleasepool語義
- 15. Autoreleasepool和dispatch_async
- 16. @Autoreleasepool在AppleScriptObjc與ARC
- 17. Autoreleasepool內存泄漏?
- 18. 有條件連接的@autoreleasepool
- 19. autoreleasepool行上的錯誤
- 20. 在ARC裏面使用@autoreleasepool
- 21. autoreleasepool和池漏與ARC
- 22. 我應該使用AutoreleasePool嗎?
- 23. 的XCode 4.2.1 @autoreleasepool不工作
- 24. 每個對象一個AutoreleasePool?
- 25. @autoreleasepool的正確用法
- 26. iOS 6中@autoreleasepool的含義
- 27. AutoreleasePool在UIApplication的循環
- 28. 什麼「?」做?什麼是__FILE__?
- 29. 什麼是<NS0:什麼?
- 30. 什麼是setDetailItem:做什麼?
或許http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –