异步swift函数应该保留对该对象的强引用吗?
我们实现并扩展NSData,将数据异步持久化到URL。 这是一个简短版本的功能。异步swift函数应该保留对该对象的强引用吗?
extension NSData { func writeToURL1(url:NSURL, completion:() -> Void) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { [weak self] in
guard let spanSelf = self else { return }
spanSelf.writeToURL(url, atomically: true)
completion()
})
}
}
下面是我们如何使用它:
var imageData = UIImageJPEGRepresentation(image, 0.8) imageData?.writeToURL(someURL) { in ... }
当然,问题是,如果写操作完成之前spanSelf
将是零imageData
被释放,并完成处理程序将永远不会被调用。
有两个解决这一问题。
- 在完成块删除
[weak self]
(即在writeToURL1
的强引用self
。 - 参考
imageData
(即imageData?.writeToURL(someURL) { in imageData = nil ... }
)
什么方法更斯威夫特友好,我们应该选择什么方法?
谢谢!
回答:
您应该如果您不希望物体从脚下离开(并且这样做不会创建参考周期),请使用强参考。如果你不在意物体是否从脚下离开,那么它就是一个弱点;如果你需要物体在周围,并且有强有力的保证,物体不会从你的脚下消失,但是一个强有力的参考会产生一个循环。
在你的情况,你所关心的对象可能会消失,因为这意味着你将无法保存。由于您不能保证其他东西会保持对象的活动状态,直到完成任务,您应该使用强引用。
对闭包中的self
的强引用是一个问题,因为它很容易以非显而易见的引用循环结束,但是您知道引用将在闭包之后立即丢弃执行,所以这不是一个问题。
回答:
这听起来像你只是想极力捕捉参考NSData对象,所以去除[weak self]
在我看来是最简单,最好的办法。通常,使用弱引用来避免在闭包中捕获时的保留周期。但是,您实际上并未创建保留周期,只是通过在块中捕获自己来保留一种方法。该块不是由自我保留的,它只是将调用堆栈传递到dispatch_async中,最终在该块中调用和释放该块。因此,通过使用weak self
不存在保留周期,您只需通过闭合发生保留就可以了。也就是说,您希望将数据保存在内存中直到调用闭包。
以上是 异步swift函数应该保留对该对象的强引用吗? 的全部内容, 来源链接: utcz.com/qa/259087.html