1

retain在单例上使用有什么意义吗?我相信使用单例模式的全部意义在于保持一个全局对象可以从各种类中访问。retain在这样的对象上使用什么情况?

通常,retain单例类中的实现返回self(不是单例实例),如下所示:

-(id)retain
{
   return self;
}

最近浏览了一些开源代码,作者反复保留单例

object = [[SingletonClass shareObject] retain]

并在dealloc.

因此,当我尝试构建这个项目时,它首先工作,然后当它试图访问单例对象上的变量时崩溃。

如果我保留一个单例对象并尝试访问它,究竟会发生什么?

4

3 回答 3

2

仅仅因为它是一个单例并不意味着它的生命周期必然是进程的生命周期。例如,您可能有一些获取资源的单例。但是在您需要该资源之前,创建它是没有意义的。同样,您可能知道所有实例都使用该资源完成,那么为什么要保留它呢?跟踪单例是否需要继续存在的一种简单方法是保留计数。

例如,您可能有一个代表内置于用户设备中的摄像机的单例。应用程序的不同部分可能需要访问相机。但也有可能在没有相机的情况下使用您的应用程序,或者工作流程可能会要求相机在某些时候关闭(出于隐私或其他原因)。因此,在用户启动开始使用相机的操作之前,您不会分配单例。他们可能会使用相机执行多项操作,例如拍照、扫描二维码、录制一些视频等。然后他们可能会结束所有这些操作并需要释放相机所占用的内存(尤其是在移动设备上) )。所以他们结束了这些行动。如果每个与相机相关的动作都保留了相机单例,那么每个动作完成后都会释放它,

于 2013-09-18T04:52:59.060 回答
0

一致性。请务必始终保留您保留引用的对象,即使它们是单例的,当您忘记保留引用计数确实重要的对象时,您也不会犯错误。

于 2013-09-18T04:51:10.047 回答
0

永远不要坚持单身。不能保证底层库/类/管理器不会在应用程序的生命周期中用新对象替换该单例。单例访问静态方法的目的是让当前有效的单例随时可供任何调用者使用。

单例由任何人编写,不能保证单例不会切换。唯一的保证是特定类在任何时候都只有一个现有实例。

如果您在某些时候保留了一个单例,那么您保留的对象可能是无效的,或者更糟的是,它与类 singleton() 方法所持有的对象完全不同。

于 2019-11-20T18:54:11.097 回答