如何实现迅速关闭单向引用
问题描述:
我尝试封装大多数操作我的异步活动,而且往往我有启动其他操作等操作......如何实现迅速关闭单向引用
,我现在面临的问题当我参考原始操作时,可以在连续操作完成之前取消分配。如果我有weak self
,weak me = self
或(灾难性地)unowned me = self
到位,我使用的关闭失败;但如果没有他们使用self
,那么这两个操作都不会释放(内存泄漏)。
是否有可能在闭包内保持引用活着而不创建双向循环引用情形?
答
首先,您需要问自己,您的self
未来是否会变为零。如果是,则weak
和unowned
进来图片。
安全的方法是使用weak
,然后检查它是否已被释放。
your-closure { [weak self] in
guard let strongSelf = self else {
print("self is been deallocated")
return
}
}
当闭包在上述情况下运行时,它将只捕获weak self
。在关闭的瞬间,weak self
要么是self
,要么是零。您可以测试以确定是否设置了strongSelf
。
如果weak self
等于self
,那么strongSelf
保留它,并且它保持保留直到它被释放时关闭返回。这是全部或没有。
我明白了。我的问题是关于你的回答中的'如果不是'部分。如果我试图阻止自己在将来没有永久分配到内存中,那么该怎么办?因为我正在使用ops,所以它们会耗尽并终止,除非我创建了一个perm链接,但我在问是否有办法避免这种情况。 –
我想要原始操作进行环聊直到完成它,然后才能释放它。 –
@JamesLingo在这种情况下,你将不得不使用强大的自我保持“操作”。这里没有别的选择。只有在这种情况下,自我的一生才会延续到块完成后。另请注意,无论“Self”是否仍然存在或已在同一时间内被释放,块最终都会被执行。 – Rahul