2010-03-09 110 views
0

没有人有任何的偏好或意见有关使用要么...Singleton:在哪里创建实例?

static id sharedReactor = nil; 

+(id)sharedInstance { 
if(sharedReactor == nil) sharedReactor = [[super allocWithZone:NULL] init]; 
return sharedReactor; 
} 

OR:

static id sharedReactor = nil; 

+(void)initialize { 
if(sharedRandomReactor == nil) { 
sharedRandomReactor = [[super allocWithZone:NULL] init]; 
} 

+(id) sharedInstance { 
    return sharedReactor; 
} 

要使用+(无效),我的脑海里似乎初始化了很多更优雅,我只是好奇有什么比我有更多经验的人会想到这两种方法?

加里

+0

在这个假设中,什么叫'initialize'? – 2010-03-09 18:29:37

+0

显然...“运行时发送初始化给程序中的每个类,恰好在类或从它继承的任何类之前,从程序中发送它的第一条消息(因此可能永远不会调用该方法)运行时以线程安全的方式将初始化消息发送给类。超类在它们的子类之前接收到这个消息。“ – fuzzygoat 2010-03-09 18:50:32

+0

但是:我刚刚从bbum中发现了一个博客条目,重新说明了如果一个子类没有实现它,但是superClass可以执行多次初始化的可能性。鉴于这个新证据,我将采用第一种方法。 – fuzzygoat 2010-03-09 18:54:10

回答

0

我刚刚从bbum发现了一个博客条目,如果一个子类没有实现它,但是超类有,可以重新执行+初始化的可能性不止一次。只要你牢记这个弱点+(无效)初始化可能是最好的选择,特殊的地方,你需要线程安全,你不想采用@synchronized命中。在说过,如果你只是寻找简单的单例作为共享数据模型使用,而不是担心线程安全问题,那就去找第一个。

0

我喜欢+(id)instance和方法本身内的局部静态的。 (更像第一个例子)

0

第一个选项的问题是,您现在有一个更多的责任,即调用“Initialize”=>更多可能的错误。

但是,第二个优点是,在初始化实例一后,代码不再检查它是否为零,因此它可以节省您很少的CPU周期。

虽然,我与第一个去..

+1

运行时系统首次将类加载到内存后立即调用+ initialize方法。你的代码不应该直接调用这个方法。 – jlehr 2010-03-09 22:01:03

2

Mike Ash's site这里是使用大中央调度的另一种方式:

+ (id)sharedWhatever 
{ 
    static dispatch_once_t pred; 
    static Whatever *whatever = nil; 
    dispatch_once(&pred, ^{ 
     whatever = [[Whatever alloc] init]; 
    }); 
    return whatever; 
} 
+0

但iPhone OS上存在libdispatch吗? (见标签) – 2010-03-09 20:13:45

0

这是要走的路...

static id sharedReactor = nil; 

+(id)sharedInstance { 
if(sharedReactor == nil) sharedReactor = [[super allocWithZone:NULL] init]; 
return sharedReactor; 
} 

这两种方法更清晰。

+0

为什么不只是[[self alloc] init]而不是[[super allocWithZone:nil] init]? – jlehr 2010-03-09 22:02:53

+0

另外,为什么在+ sharedInstance方法的范围之外暴露静态变量? – jlehr 2010-03-09 22:10:05

+0

静态变量只需分配一次。 – Jordan 2010-03-09 23:39:20

0

我一直按照Cocoa Fundamentals guide from Apple的建议。通过这种方式,无论该类是多次实例化还是通过sharedInstance类方法访问,返回的对象始终都是相同的。

该指南还强调重新定义保留/释放,以防止其资源被回收。只是FYI。