![](/img/trans.png)
[英]UIWebView - crash when dismissing modal view controller while request is in progress
[英]When is self deallocated while dismissing view controller
我有一個關於內存釋放和塊/閉包的問題。
以下是Swift方法
self!.dismissViewControllerAnimated(false, completion: {
println(self);
})
或者目標C方法
[self dismissViewControllerAnimated:NO completion:^{
NSLog("%@",self);
}];
我真的很感激,如果有人能夠解釋在上述方法中什么時候自我將被解除分配。 是在完成塊運行之后還是之前? 我理解它由ARC照顧,但我想知道self是否在完成塊中或之后獲得釋放消息。 因此,如果我在完成塊中進行一些小的清理(訪問自己),是否安全/可接受?
完全理解答案確實有兩個獨立的問題:
您可以將閉包視為另一種類型(在Swift中它們確實是這樣)。 每個閉包都會對其中引用的變量(包括self
產生強大的所有權。 這可確保您永遠不會引用已解除分配的變量。 就像在任何其他對象中一樣,當閉包被解除分配時,它會釋放對其所有變量的所有權。
如果閉包是唯一具有對該變量的強引用的東西,則在釋放閉包時將取消分配該變量。
簡而言之,只要閉包仍在內存中,變量就會保留在內存中。
現在,理解這一點的第二部分是關閉何時被解除分配。 您可以在變量中存儲閉包:
func myMethod() {
var myClosure = {
println(self)
}
myClosure()
}
在這種情況下,閉包具有來自其變量myClosure
的強引用,並且閉包具有對self
的強引用。 一旦myClosure
超出范圍,即當myMethod
退出時,它將被解除分配。 當這種情況發生時,自我將被釋放。
您可能還有一個情況,比如在您的問題中,您將閉包傳遞給另一個方法。 在這種情況下,傳遞閉包的方法是捕獲對閉包的強引用。 當該方法退出時,它將釋放你的閉包,閉包將被釋放,它將釋放在其中捕獲的所有變量。
有時需要定義一個不對變量擁有所有權的閉包。 你這樣做是為了避免循環引用 。 您可以在Apple的文檔中閱讀更多關於循環引用的內容以及如何在此處進行預防。 但是,重要的是要認識到,除非你付出明確的努力(和代碼),閉包將始終捕獲對其中引用的變量的強引用。
在Swift中,在開發/調試並嘗試理解操作的時間時,可以將以下內容添加到View Controllers(或任何類),以跟蹤實例是否或何時將要解除分配。
雖然這不會幫助您檢測此處描述的“強參考周期”:
deinit {
println(__FUNCTION__, "\(self)")
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.