Singleton:在哪里创建实例?

时间:2010-03-09 18:27:34

标签: iphone objective-c cocoa singleton

是否有人对使用其中任何一个有任何偏好或评论...

static id sharedReactor = nil;

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

static id sharedReactor = nil;

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

+(id) sharedInstance {
    return sharedReactor;
}

在我看来,使用+(void)初始化似乎更优雅,我只是好奇那些比我自己更有经验的人会想到这两种方法?

加里

6 个答案:

答案 0 :(得分:2)

Mike Ash's site这里是使用Grand Central Dispatch的另一种方式:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

尽管如此,我会选择第一个......

答案 3 :(得分:0)

这是要走的路......

static id sharedReactor = nil;

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

两种方法都清楚得多。

答案 4 :(得分:0)

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

该指南还强调了重新定义保留/释放以防止其资源被回收。仅供参考。

答案 5 :(得分:0)

我刚刚发现了一个来自bbum的博客条目,重新考虑了如果一个subClass没有实现它而且superClass可以执行多次初始化+ initialize的可能性。只要记住这个缺点+(void)初始化可能是最好的选择,特别是你需要线程安全而且你不想接受使用@synchronized的命中。在说如果你只是寻找简单的单身人士作为共享数据模型并且不担心线程安全之后再说第一个。