2017-05-25 40 views
0

我尝试封装大多数操作我的异步活动,而且往往我有启动其他操作等操作......如何实现迅速关闭单向引用

,我现在面临的问题当我参考原始操作时,可以在连续操作完成之前取消分配。如果我有weak self,weak me = self(灾难性地)unowned me = self到位,我使用的关闭失败;但如果没有他们使用self,那么这两个操作都不会释放(内存泄漏)。

是否有可能在闭包内保持引用活着而不创建双向循环引用情形?

回答

0

首先,您需要问自己,您的self未来是否会变为零。如果是,则weakunowned进来图片。

安全的方法是使用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保留它,并且它保持保留直到它被释放时关闭返回。这是全部或没有。

+0

我明白了。我的问题是关于你的回答中的'如果不是'部分。如果我试图阻止自己在将来没有永久分配到内存中,那么该怎么办?因为我正在使用ops,所以它们会耗尽并终止,除非我创建了一个perm链接,但我在问是否有办法避免这种情况。 –

+0

我想要原始操作进行环聊直到完成它,然后才能释放它。 –

+0

@JamesLingo在这种情况下,你将不得不使用强大的自我保持“操作”。这里没有别的选择。只有在这种情况下,自我的一生才会延续到块完成后。另请注意,无论“Self”是否仍然存在或已在同一时间内被释放,块最终都会被执行。 – Rahul