繁体   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