2

您可以通过多种方式创建单例。我想知道这之间哪个更好。

+(ServerConnection*)shared{
    static dispatch_once_t pred=0;
    __strong static id _sharedObject = nil;
    dispatch_once(&pred, ^{
        _sharedObject = [[self alloc] init]; // or some other init method

    });
    return _sharedObject;
}

我可以看到这编译成非常快的东西。我认为检查谓词将是另一个函数调用。另一个是:

+(ServerConnection*)shared{
    static ServerConnection* connection=nil;
    if (connection==nil) {
        connection=[[ServerConnection alloc] init];
    }
    return connection;
}

两者之间有什么重大区别吗?我知道这些可能足够相似,不必担心。但只是想知道。

4

1 回答 1

2

主要区别在于第一个使用 Grand Central Dispatch 来确保创建单例的代码只会运行一次。这向您保证它将是一个单例。

GCD 还应用了威胁安全性,因为根据规范,对 dispatch_once 的每个调用都将同步执行。

我会推荐这个

+ (ConnectionManagerSingleton*)sharedInstance {

    static ConnectionManagerSingleton *_sharedInstance;
    if(!_sharedInstance) {
        static dispatch_once_t oncePredicate;
        dispatch_once(&oncePredicate, ^{
            _sharedInstance = [[super allocWithZone:nil] init];
        });
    }

    return _sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {    

    return [self sharedInstance];
}

- (id)copyWithZone:(NSZone *)zone {
    return self;    
}

取自这里http://blog.mugunthkumar.com/coding/objective-c-singleton-template-for-xcode-4/

编辑:

这是您要问的确切答案 http://cocoasamurai.blogspot.jp/2011/04/singletons-your-doing-them-wrong.html

编辑2:

前面的代码是针对 ARC 的,如果你想要非 arc 支持添加

#if (!__has_feature(objc_arc))

- (id)retain {  

    return self;    
}

- (unsigned)retainCount {
    return UINT_MAX;  //denotes an object that cannot be released
}

- (void)release {
    //do nothing
}

- (id)autorelease {

    return self;    
}
#endif

(与第一个链接中的解释完全相同)

最后一个关于单例的很好的解释:

http://cshapindepth.com/Articles/General/Singleton.aspx

于 2012-06-02T04:27:12.803 回答