我在 swift 中访问闭包内的实例方法,self 引用在某些情况下变为 nil,这导致我的程序崩溃。我尝试使用 [weak self]
进行访问,但是当 self 为 nil
时,它无法调用实例方法。
[weak self] () -> () in
最佳答案
[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)
}
将保证在回调完成之前不会释放 self。
或者你可以使用类似的东西:
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
guard let strong = self else { print("self released") ; return }
print(strong.name)
}
关于swift - swift 闭包中的 self 引用在一段时间内返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43147019/