Objective-C Singleton实现,我做得对吗?

Jam*_*sev 2 singleton objective-c

在我的班级甲板我有

static Deck *gInstance = NULL;


+(Deck *) instance {
    @synchronized(self) {
        if (gInstance == NULL)
            gInstance = [[self alloc] init];
    }

    return (gInstance);
}
Run Code Online (Sandbox Code Playgroud)

和一个看起来像的init方法

-(id) init {

    if (gInstance != NULL) {
        return self;
    }

    self = [super init];

    if (self) {
       // Lots of clever things
    }
    gInstance = self;
    return self;

}
Run Code Online (Sandbox Code Playgroud)

我在这里关心的主要是是否init正确实施.如果我写的内容适合你,请告诉我.

或者...有没有办法让我init私密并阻止人们(包括我自己)完全看到它?

Jos*_*erg 6

这是一种奇怪的单例实现.我最喜欢的实现是使用GCD中的一些新功能.

+ (MyObj*)sharedObject;
{
    static dispatch_once_t once;
    static MyObj *sharedObj;
    dispatch_once(&once, ^ { shared = [[MyObj alloc] init]; });
    return shared;
}
Run Code Online (Sandbox Code Playgroud)

我建议只做这件事,仅此而已.强制执行一个严格的单身人士只会痛苦地结束,而且通常是毫无意义的反模式.

至于你的实现有什么严格"错误",我相信你想gInstance在初始化器中返回它不是NULL,而不是self.