gpt4 book ai didi

swift - 为什么我必须解开一个软弱的 self ?

转载 作者:可可西里 更新时间:2023-11-01 00:18:51 24 4
gpt4 key购买 nike

我创建了一个名为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com