下面关于Objective-C内存管理的描述错误的是 A 当使用ARC来管理内存时,代码中不可以出现autorelease B autoreleasepool 在 drain 的时候会释放在其中分配的对象 C 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露 D 在使用ARC的项目中不能使用NSZone
以下內容主要為回复 @ChickenBoy 的“Each thread in a Cocoa application maintains its own stack of autorelease pool blocks.其他線程中是需要自己創建autoreleasepool的,內存不會自動釋放,就會產生洩漏內存。”。
Each thread in a Cocoa application maintains its own stack of autorelease pool blocks. 這句話只陳述了一個事實「Cocoa 應用的每一個線程維護了它自己的自動釋放池塊的棧」 If you are writing a Foundation-only program or if you detach a thread, you need to create your own autorelease pool block. 如果你在編寫Foundation-only 應用或自己detach 一個線程,你需要創建自己的自動釋放池塊。
If your application or thread is long-lived and potentially generates a lot of autoreleased objects, you should use autorelease pool blocks (like AppKit and UIKit do on the main thgroate the blocks ( . If your detached thread does not make Cocoa calls, you do not need to use an autorelease pool block. 如果你的應用或者線程長時間存活,並可能產生大量的自動釋放的對象;你應該自動自動釋放池塊;否則,自動釋放的物件會累積並佔用你的記憶體。 如果你建立的執行緒沒有呼叫 Cacoa,你不需要使用自動釋放池塊。
A的錯誤在於使用ARC時,編譯器會禁止你使用autorelease,而由編譯器幫你加,就像retain,release一樣。但是你可以使用__autoreleasing來指定變量,使它加入autoreleasepool
C的描述是對的,在遇到需要大量創建物件的地方使用autoreleasepool可以加快物件釋放的速度。
如果說A是錯的,那隻能是說明出題者想考你ARC的原理其實是編譯器自動幫你在程式碼中加入autorelease等程式碼。其實在ARC的專案中寫autorelease連編譯都通不過,這樣想得話A其實也是對的。
不過既然其他3個都是對的,也只能選A了。
==========更新==========
上面的文檔是關於MRC的,ARC中在線程大量創建對象需不需要autorelease pool可以看這個回答:希望踩我答案的人可以在我這個回答的評論區告訴我什麼地方錯了。
即使我隻大概推測了為什麼A不對,但是我明確回答了樓主C是對的。
至於C為什麼是對的,可以去看官方文件:autoreleasepool。
http://stackoverflow.com/ques...
A 和 D 基本上是相同的,但實際上
NSZone *zone = NSDefaultMallocZone();
這句程式碼是可以編譯運行的。
你看的參考答案不對。
ARC 下,不能使用 autorelease 進行編程,但可以使用
@autoreleasepool
。它的作用是降低記憶體佔用。Each thread in a Cocoa application maintains its own stack of autorelease pool blocks.
這句話只陳述了一個事實「Cocoa 應用的每一個線程維護了它自己的自動釋放池塊的棧」
If you are writing a Foundation-only program or if you detach a thread, you need to create your own autorelease pool block.
如果你在編寫Foundation-only 應用或自己detach 一個線程,你需要創建自己的自動釋放池塊。
If your application or thread is long-lived and potentially generates a lot of autoreleased objects, you should use autorelease pool blocks (like AppKit and UIKit do on the main thgroate the blocks ( . If your detached thread does not make Cocoa calls, you do not need to use an autorelease pool block.
如果你的應用或者線程長時間存活,並可能產生大量的自動釋放的對象;你應該自動自動釋放池塊;否則,自動釋放的物件會累積並佔用你的記憶體。
如果你建立的執行緒沒有呼叫 Cacoa,你不需要使用自動釋放池塊。
你自己開闢的新的線程,裡面的內存就得自己去管理的,只有在主線程的中runloop中才會自動幫你加autoreleasePush()跟autoreleasePop().
因為ARC是編譯器特性,而不是iOS執行時間特性,更不是其他語言的垃圾收集器。
所以這意味著這它只能處理在編譯時就確定的記憶體管理,所用的機制就是引用計數。
換句話說,他的記憶體釋放不是強制的,例如記憶體互相引用,動態引用等會導致引用計數不會立刻置0,所以這個時候明確釋放是有必要的。