gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:53:20 28 4
gpt4 key购买 nike

我们实现并扩展了 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/

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