在单例实例的内存透视图中,如何删除单例实例,因为它被放入自动释放池?
答案 0 :(得分:3)
单例实例不应放在自动释放池中。 Singleton实例应该创建一次(通常在第一次引用时)并在应用程序终止时删除(我的意思是iOS自动)。这就是为什么通常将单例赋值给静态变量。
在分配给该静态变量时,应该增加单例实例的引用计数器(保留)。此时,即使您将其添加到自动释放池,它也不会被删除,因为它已经保留在其他地方。
要删除该单例实例,您只需要释放分配给静态变量的当前对象(例如release)并指定nil或创建一个新单例。如果已将相同的实例添加到自动释放池中,则只有在自动删除该自动释放池之后才会立即将其删除。但是它在应用程序中不应该有太大变化,因为单例已经是nil或重新创建为新实例,因此任何进一步的调用都将检索新实例。
同样,我没有看到为什么要将单例添加到自动释放池中的任何原因。如果这不能解答您的问题,请分享一段代码。
答案 1 :(得分:1)
请参阅此链接
http://www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/
Apple在此简要解释了这一点。在'创建单例实例'主题下答案 2 :(得分:1)
关于如何创建单身人士存在争议。我使用以下模式:
+ (MYSingletonClass *) sharedInstance
{
static dispatch_once_t onceToken;
static MYSingletonClass * __sharedInstance = nil;
dispatch_once(&onceToken, ^{
__sharedInstance = [[self alloc] init];
});
return __sharedInstance;
}
根据OP的澄清,事实证明这并没有回答这个问题,但我认为无论如何我都会分享:)
参见this post比较@synchronized v dispatch_once
答案 3 :(得分:0)
据我所知,单身人士很有帮助,因为在您的应用关闭之前, NOT 会释放它们。因此,您的数据始终可用。
如果你需要释放记忆,我建议你找一种不同的方法来管理数据...
答案 4 :(得分:0)
static id sharedInstance=nil;
+(id)sharedInstance
{
@synchronized(self)
{
if(!sharedInstance)
{
NSLog(@"Allocated");
sharedInstance = [[self alloc] init];
}
}
return sharedInstance;
}
//standard way to declare singleton object
答案 5 :(得分:0)
如果你需要清除它的内容,也许你可以为你的单例对象添加一个“清晰”的方法......