保留您访问的单例的意义是什么?

问题描述 投票:1回答:3

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

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

-(id)retain
{
   return self;
}

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

object = [[SingletonClass shareObject] retain]

并在dealloc中释放了它。

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

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

objective-c cocoa memory-management singleton retain
3个回答
2
投票

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

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


0
投票

一致性。指出always]保留您保留引用的对象,即使它们是单例,并且当您忘记保留引用计数确实重要的对象时,也不会犯错。


0
投票

请不要坚持单例。不能保证基础库/类/管理器在应用程序的生存期内不会用新对象替换该单例。单例访问静态方法的目的是使当前有效的单例随时可用于任何调用者。

© www.soinside.com 2019 - 2024. All rights reserved.