簡體   English   中英

何時在解除視圖控制器時自行解除分配

[英]When is self deallocated while dismissing view controller

我有一個關於內存釋放和塊/閉包的問題。

以下是Swift方法

    self!.dismissViewControllerAnimated(false, completion: {
        println(self);
     })

或者目標C方法

   [self dismissViewControllerAnimated:NO completion:^{
       NSLog("%@",self);
   }];

我真的很感激,如果有人能夠解釋在上述方法中什么時候自我將被解除分配。 是在完成塊運行之后還是之前? 我理解它由ARC照顧,但我想知道self是否在完成塊中或之后獲得釋放消息。 因此,如果我在完成塊中進行一些小的清理(訪問自己),是否安全/可接受?

完全理解答案確實有兩個獨立的問題:

1.何時在閉包內引用變量?

您可以將閉包視為另一種類型(在Swift中它們確實是這樣)。 每個閉包都會對其中引用的變量(包括self產生強大的所有權。 這可確保您永遠不會引用已解除分配的變量。 就像在任何其他對象中一樣,當閉包被解除分配時,它會釋放對其所有變量的所有權。

如果閉包是唯一具有對該變量的強引用的東西,則在釋放閉包時將取消分配該變量。

簡而言之,只要閉包仍在內存中,變量就會保留在內存中。

2.什么時候關閉分配?

現在,理解這一點的第二部分是關閉何時被解除分配。 您可以在變量中存儲閉包:

func myMethod() {
    var myClosure = {
        println(self)
    }
    myClosure()
}

在這種情況下,閉包具有來自其變量myClosure的強引用,並且閉包具有對self的強引用。 一旦myClosure超出范圍,即當myMethod退出時,它將被解除分配。 當這種情況發生時,自我將被釋放。

您可能還有一個情況,比如在您的問題中,您將閉包傳遞給另一個方法。 在這種情況下,傳遞閉包的方法是捕獲對閉包的強引用。 當該方法退出時,它將釋放你的閉包,閉包將被釋放,它將釋放在其中捕獲的所有變量。

例外

有時需要定義一個不對變量擁有所有權的閉包。 你這樣做是為了避免循環引用 您可以在Apple的文檔中閱讀更多關於循環引用的內容以及如何在此處進行預防。 但是,重要的是要認識到,除非你付出明確的努力(和代碼),閉包將始終捕獲對其中引用的變量的強引用。

在Swift中,在開發/調試並嘗試理解操作的時間時,可以將以下內容添加到View Controllers(或任何類),以跟蹤實例是否或何時將要解除分配。

雖然這不會幫助您檢測此處描述的“強參考周期”:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

deinit {
    println(__FUNCTION__, "\(self)")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM