swift 闭包 return 内的自我引用 无时间
self refrence inside swift closure return nil some time
我在 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)
}
我可以通过在创建强实例时创建强实例来解决这个问题,在我的例子中,这个弱变量使自身变为 nil。感谢大家为我的查询提供建议。
我在 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)
}
我可以通过在创建强实例时创建强实例来解决这个问题,在我的例子中,这个弱变量使自身变为 nil。感谢大家为我的查询提供建议。