4

由于共享单例实例将始终存在,我们可以安全地[unowned self]在该单例类中的所有闭包中使用吗?

4

2 回答 2

6

当然,它是安全的。但这不是一个很好的理由。

是使用弱引用还是强引用,应该根据你正在编写的函数中的内存管理特性。例如,如果一个闭包被对象强引用,那么闭包应该捕获对该对象的弱引用;这是安全的,因为没有其他人对闭包有引用,所以它只能在主对象处于活动状态时执行,等等。如果没有保留周期,并且闭包被提供给单独的 API,因此它不会被绑定到主对象的生命周期,那么闭包应该对主对象有一个强引用。这个推理同样适用于单例和非单例。

于 2015-05-29T22:20:47.640 回答
1

是的,单例对自身有很强的引用,不能被处理掉。

基于此可以肯定地说,您可以安全地创建对其的弱引用或无主引用。

来自苹果文件:

该类在第一次被请求时懒惰地创建它的唯一实例,然后确保不能创建其他实例。单例类还可以防止调用者复制、保留或释放实例。

一个简单的测试方法是从主类进行测试。

  • 创建一个新类(我们称之为“第一类”),它用一些值初始化单例,并在完成一项独特的工作后处置。
  • 之后在主类中创建另一个类(我们称之为“第二类”),它检索单例实例并读取其值。

在第一个(已部署的)类和第二个(新创建的)类之间没有对单例的引用。

  • 现在读取值,如果值仍然存在,则证明单例已通过其自己的引用保持活动状态。
于 2015-05-29T03:13:00.130 回答