我创建了一个名为 VerifyObject
的类,它包含一个具有类似签名的函数
typealias handlerCodeID = (String) ->Void
class func checkPause(withID:String?,
runOnPause: handlerCodeID?)
当我运行它时,我需要将弱自引用传递给闭包内部,使用
VerifyObject.checkPause(withID: "abcde",
runOnPause: {[weak self] (objectID) in
self.doSomething()
})
Xcode 提示 doSomething
中的 self
必须解包到
self!.doSomething()
为什么?没有意义。
最佳答案
self 在一个完成处理程序中,所以一旦回调被触发它可能不再存在(它可能是一个网络操作或者需要一些时间并且不会在几秒钟内返回结果)。
你可以在访问之前检查 self 是否存在而不是解包:
VerifyObject.checkPause(withID: "abcde",
runOnPause: {[weak self] (objectID) in
guard let self = self else { return }
self.doSomething()
})
如果 self 不是 nil,甚至更短 doSomething
:
VerifyObject.checkPause(withID: "abcde",
runOnPause: {[weak self] (objectID) in
self?.doSomething()
})
或者如果你绝对确定 self 会存在:
VerifyObject.checkPause(withID: "abcde",
runOnPause: {(objectID) in
self.doSomething()
})
请注意,如果 2 个对象彼此有强引用并且它们永远不会被释放,最后一个可能会导致 reain cicles。
关于swift - 为什么我必须解开一个软弱的 self ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57709872/