ios - 异步 swift 函数是否应该保留对该对象的强引用?

标签 ios swift retain-cycle

我们实现并扩展了 NSData,将数据异步保存到 URL。 这是该函数的简短版本。

extension NSData {

    func writeToURL1(url:NSURL, completion: () -> Void)  {

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { [weak self] in

            guard let strongSelf = self else { return }

            strongSelf.writeToURL(url, atomically: true)

            completion()
            })
    }
}

下面是我们如何使用它:

var imageData = UIImageJPEGRepresentation(image, 0.8)
imageData?.writeToURL(someURL) { in ... }

问题当然是如果 imageData 在写操作完成之前被释放 strongSelf 将是 nil 并且永远不会调用完成处理程序。

这个问题有两种解决方案。

  1. 删除 [weak self](即在 writeToURL1 中对 self 进行强引用。
  2. 在完成 block 中引用 imageData(即 imageData?.writeToURL(someURL) { in imageData = nil ... })

哪种方法对 Swift 更友好,我们应该选择哪种方法?

谢谢!

最佳答案

如果您不希望对象从您的脚下消失(并且这样做不会创建引用循环),则应使用强引用;如果您不关心物体是否从您脚下离开,则为弱引用;一个无主引用,如果你需要对象在身边,并且强烈保证对象不会从你脚下消失,但强引用会创建一个循环。

在您的情况下,您关心对象是否会消失,因为这意味着您将无法保存它。由于您无法保证在该任务完成之前,其他东西会让对象保持事件状态,因此您应该使用强引用。

当你随身携带闭包时,闭包中对 self 的强引用是一个问题,因为很容易以不明显的引用循环结束,但你知道引用将是在闭包执行后立即下降,所以这不是问题。

关于ios - 异步 swift 函数是否应该保留对该对象的强引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39460502/

相关文章:

ios - 具有自定义方案的 AsanaConnect oAuth 重定向 URL

swift - 使用 Alamofire 的 iOS http POST

ios - 在单个 ViewController 应用程序中,内存保留周期是不可能的吗? ( swift/IOS)

arrays - 在 Swift 中从字典中获取值或键时保留循环

ios - 如何正确处理带有参数的 Swift block 中的 Weak Self

ios - 如何使用 Alamofire 发送表单数据主体

javascript - IOS 蓝牙键盘 - 输入 - Tab 事件

ios - Google 登录显示不正确的项目名称 - iOS

ios - swift 3 : Error in TableView when deleting cells holding UserDefault values

arrays - 快速处理稀疏数组