2015-02-24 69 views
-1

我正在阅读一本试图刷掉Objective-C灰尘的书,并且在阅读如何实现单例时遇到了这个问题。这是执行,因为他们有它的书:正确的单例执行

+ (ClassName *)sharedClass { 
static ClassName *sharedClass = nil; 
if (!sharedClass) { 
sharedClass = [[super allocWithZone:nil] init]; 

return shared store 

} 

我的问题是,他们为什么会设置为每次方法是跑为零,然后检查它是否是零,它现在显然,和创建一个新的实例?这听起来像是打败了单身人士的整个目的,只有一个班级的实例。我注意到有很多与单例实现相关的问题,但没有涉及这方面的具体问题。相信我,我在发布前仔细阅读。

+0

更好地读取函数中的静态变量。 – zaph 2015-02-24 00:03:52

+1

由于var声明为静态,所以将其视为文件级别的变量。 = nil只在最初运行。无论如何,这里有一个非常好的单身解决方案http://stackoverflow.com/questions/7568935/how-do-i-implement-an-objective-c-singleton-that-is-compatible-with-arc – danh 2015-02-24 00:04:09

+0

@Zaph Do当你将它们设置为零时,它们不会设置为零? – John 2015-02-24 00:34:05

回答

1

静态变量仅在第一次被设置为零。一旦sharedClass实例被实例化,每当你调用[ClassName sharedClass]时,你总会有相同的实例。

您应该使用线程安全模式来使用单例模式。

+ (instancetype)shared { 
    static id shared = nil; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     shared = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

这将防止可能的崩溃。

+1

想知道为什么倒票。 – zaph 2015-02-24 01:33:35