搜尋

首頁  >  問答  >  主體

ios - Objective-C内存管理面试题一道

下面关于Objective-C内存管理的描述错误的是
A 当使用ARC来管理内存时,代码中不可以出现autorelease
B autoreleasepool 在 drain 的时候会释放在其中分配的对象
C 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露
D 在使用ARC的项目中不能使用NSZone

= =。。
网上看到的,参考答案为A.

我觉得选C来的~

不知道A错在哪里了?

大家讲道理大家讲道理2771 天前513

全部回覆(5)我來回復

  • 巴扎黑

    巴扎黑2017-04-18 09:51:28

    A的錯誤在於使用ARC時,編譯器會禁止你使用autorelease,而由編譯器幫你加,就像retain,release一樣。但是你可以使用__autoreleasing來指定變量,使它加入autoreleasepool

    回覆
    0
  • PHPz

    PHPz2017-04-18 09:51:28

    C的描述是對的,在遇到需要大量創建物件的地方使用autoreleasepool可以加快物件釋放的速度。
    如果說A是錯的,那隻能是說明出題者想考你ARC的原理其實是編譯器自動幫你在程式碼中加入autorelease等程式碼。其實在ARC的專案中寫autorelease連編譯都通不過,這樣想得話A其實也是對的。
    不過既然其他3個都是對的,也只能選A了。

    ==========更新==========
    希望踩我答案的人可以在我這個回答的評論區告訴我什麼地方錯了。
    即使我隻大概推測了為什麼A不對,但是我明確回答了樓主C是對的。
    至於C為什麼是對的,可以去看官方文件:autoreleasepool。

    If you spawn a secondary thread.
    You must create your own autorelease pool block as soon as the thread begins executing; otherwise, your.

    ==========再次更新==========
    上面的文檔是關於MRC的,ARC中在線程大量創建對象需不需要autorelease pool可以看這個回答:

    http://stackoverflow.com/ques...

    回覆
    0
  • 黄舟

    黄舟2017-04-18 09:51:28

    A 和 D 基本上是相同的,但實際上
    NSZone *zone = NSDefaultMallocZone();
    這句程式碼是可以編譯運行的。

    你看的參考答案不對。
    ARC 下,不能使用 autorelease 進行編程,但可以使用 @autoreleasepool。它的作用是降低記憶體佔用。

        @autoreleasepool {
        }

    以下內容主要為回复 @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,你不需要使用自動釋放池塊。

    回覆
    0
  • 阿神

    阿神2017-04-18 09:51:28

    你自己開闢的新的線程,裡面的內存就得自己去管理的,只有在主線程的中runloop中才會自動幫你加autoreleasePush()跟autoreleasePop().

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:51:28

    因為ARC是編譯器特性,而不是iOS執行時間特性,更不是其他語言的垃圾收集器。
    所以這意味著這它只能處理在編譯時就確定的記憶體管理,所用的機制就是引用計數。
    換句話說,他的記憶體釋放不是強制的,例如記憶體互相引用,動態引用等會導致引用計數不會立刻置0,所以這個時候明確釋放是有必要的。

    回覆
    0
  • 取消回覆