2012-03-21 74 views
-1

在单例实例的内存透视图中,我们如何删除创建的单例实例,因为它被放入自动释放池中?在Objective-C(IOS)中,有没有人使用单例实例?

+0

我不明白你的问题。你是说你想发布一个单身人士,还是你的单身人士被释放? – 2012-03-21 10:43:14

+0

@ashley:是啊ii想要释放单例实例 – Allamaprabhu 2012-03-21 10:45:35

+1

你能向我们解释为什么你想这么做吗?单身人士的重点在于它是一次创建的单个实例。如果你正在发布,然后创建另一个实例,它不是一个单例。 – 2012-03-21 10:48:04

回答

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

+0

如果你是投我失望的人,请留下评论,以便我可以改进我的答案。 – 2012-03-21 12:12:06

0

据我所知,单身人士是有帮助的,因为你做不是直到你的应用程序关闭。所以你的数据总是可用的。

如果你需要释放内存,我建议你找到一个不同的方式MENAGE数据...

3

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

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

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

同样,我不明白为什么要添加一个单例到autorelease池。如果这不能回答你的问题,请分享一段代码。

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 
+0

在iOS 4.0或更高版本中,您应该移至dispatch_once ...它是线程安全的并且更快 – 2012-03-21 12:05:41

0

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