为什么自动不会在块中自动声明为无主?

时间:2015-06-22 12:16:18

标签: swift memory-management closures automatic-ref-counting

到目前为止,我一直天真地使用Swift而没有真正关心内存管理。但我正在实施一个捕获列表,我想这有点道理。

我的问题是 - 为什么self不会被自动取消,以避免保留周期?您是否明确需要self拥有无法通过将其部分数据保存在其他地方而无法解决的情况?

1 个答案:

答案 0 :(得分:2)

给你一个简单的例子

这是一个我需要使用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秒后,它将记录

  

日志   DEINIT

但如果我改为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;

会记录

  

DEINIT

然后4秒后,应用程序崩溃。因为该对象被解除分配。

因此,如果您需要保留对象,则不要使用unowned self