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

标签 swift closures

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

相关文章:

javascript - 传单标记均具有相同的值

swift - 我怎么知道完成 block 没有执行但方法完成了?

swift - 如何从 NSURLSession.sharedSession().dataTaskWithRequest 获取数据

swift - 无法在 Metal 的片段着色器中正确访问结构对象?

ios - Runloop总是导致XPC连接中断?

ios - 我们是否总是需要在闭包中调用完成处理程序?

rust - 什么时候应该使用函数指针而不是闭包?

php - PHP 中的闭包或 create_function

php - 如何将 POST Json 和图像发送到 php alamofire

javascript 闭包不适用于数组属性?