在Objective-C(ios)中,是否有人使用过单例实例?

时间:2012-03-21 10:36:27

标签: iphone objective-c ios singleton

在单例实例的内存透视图中,如何删除单例实例,因为它被放入自动释放池?

6 个答案:

答案 0 :(得分:3)

单例实例不应放在自动释放池中。 Singleton实例应该创建一次(通常在第一次引用时)并在应用程序终止时删除(我的意思是iOS自动)。这就是为什么通常将单例赋值给静态变量。

在分配给该静态变量时,应该增加单例实例的引用计数器(保留)。此时,即使您将其添加到自动释放池,它也不会被删除,因为它已经保留在其他地方。

要删除该单例实例,您只需要释放分配给静态变量的当前对象(例如release)并指定nil或创建一个新单例。如果已将相同的实例添加到自动释放池中,则只有在自动删除该自动释放池之后才会立即将其删除。但是它在应用程序中不应该有太大变化,因为单例已经是nil或重新创建为新实例,因此任何进一步的调用都将检索新实例。

同样,我没有看到为什么要将单例添加到自动释放池中的任何原因。如果这不能解答您的问题,请分享一段代码。

答案 1 :(得分:1)

答案 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)

如果你需要清除它的内容,也许你可以为你的单例对象添加一个“清晰”的方法......