簡體   English   中英

為什么 self 不會在塊中自動聲明為無主?

[英]Why isn't self automatically declared as unowned in blocks?

到目前為止,我一直很天真地使用 Swift 而沒有真正關心內存管理。 但我正在實施一個捕獲列表,我想這有點道理。

我的問題是 - 為什么不自動將self設為無主以避免保留周期? 是否存在您明確需要擁有self而無法通過將其某些數據保存在其他地方來解決的情況?

給你一個簡單的例子

這是一個我需要使用 self 而不是unowned self

如果我在這里使用self

class Test{

func log(){
    println("log");
}
func FunctionHaveBlock(){
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        () -> Void in

        sleep(4)
        self.log()
    })
}
deinit{
    println("Deinit")
}
}

然后打電話

  var test:Test? = Test()
    test!.FunctionHaveBlock();
    test = nil;

代碼會執行得很好,4秒后,它會記錄

登錄取消初始化

但如果我改成unowned self

class Test{

func log(){
    println("log");
}
func FunctionHaveBlock(){
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        [unowned self]
        () -> Void in

        sleep(4)
        self.log()
    })
}
deinit{
    println("Deinit")
}

}

然后打電話

   var test:Test? = Test()
    test!.FunctionHaveBlock();
    test = nil;

它會記錄

初始化

然后在 4 秒后,應用程序崩潰了。因為,對象被釋放了。

所以,如果你需要保留對象,你不要使用unowned self

暫無
暫無

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

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