到目前为止,我一直天真地使用Swift而没有真正关心内存管理。但我正在实施一个捕获列表,我想这有点道理。
我的问题是 - 为什么self
不会被自动取消,以避免保留周期?您是否明确需要self
拥有无法通过将其部分数据保存在其他地方而无法解决的情况?
答案 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