我正在访问swift中的闭包内的实例方法,自我引用在某些情况下会变成 nil ,这会导致我的程序崩溃。我尝试使用[weak self]
进行访问,但在自我为nil
时无法调用实例方法。
[weak self] () -> () in
答案 0 :(得分:3)
[weak self]
的重点是不创建对self的引用(可能是为了避免循环链接和内存泄漏),以便可以释放它。如果发生这种情况,则self
将为nil
。
您应该不使用[weak self]
,或者更好的是,可以准备好处理self
已被释放并设置为nil
的情况。
guard let strong = self else { return }
举个例子:
import UIKit
import PlaygroundSupport
class Foo {
let name : String
init(name:String) {
self.name = name
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
print(self!.name)
}
}
}
Foo(name:"freddie")
PlaygroundPage.current.needsIndefiniteExecution = true
在这种情况下,你会遇到崩溃,因为在异步回调发布之前就会释放self。
您可以将asyncAfter
来电更改为:
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
print(self.name)
}
将保证在回调完成之前不会释放自我。
或者您可以使用以下内容:
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
guard let strong = self else { print("self released") ; return }
print(strong.name)
}
答案 1 :(得分:0)
我能够通过在创建它时创建强大的实例来解决这个问题,在我的情况下,这个弱变量对自己来说是零。感谢大家为我的查询提供建议。