使用ARC创建Singleton而不使用块

时间:2012-03-20 21:43:15

标签: singleton automatic-ref-counting objective-c-blocks

我想用ARC创建一个Singleton this is the answer I see

是否有将此代码转换为类似的内容而不使用块?

+ (MyClass *)sharedInstance
{
    static MyClass *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyClass alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}

编辑:

我只看到这种方法:

static MyClass *sharedMyClassInstance = nil; 

+(MyClass *) sharedMyClass
{
    @synchronized(self) {
        if (sharedMyClassInstance == nil) {
            sharedMyClassInstance = [[self alloc] init];
        }
        return sharedMyClassInstance;
    }
}

这会阻止创建多个对象吗?

2 个答案:

答案 0 :(得分:3)

是的,您可以使用其他同步机制,例如互斥锁。

static MyClass *sharedInstance = nil;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static volatile BOOL initialized = NO;

pthread_mutex_lock(&mutex);

if ( ! initialized ) {
    initialized = YES;
    sharedInstance = [[MyClass alloc] init];
    // Do any other initialisation stuff here
}

pthread_mutex_unlock(&mutex);
return sharedInstance;

答案 1 :(得分:1)

  

是否有将此代码转换为类似的内容而不使用块?

您可以继续分配您的共享对象,但之后您无法获得dispatch_once()提供的保护。该功能可确保您在应用程序执行期间为其提供的块运行时间不超过一次。如果创建单例的代码位于传递给dispatch_once()的块内,您知道应用程序中的两个线程无法同时尝试访问共享对象并可能导致创建它两次。

你有什么理由不想使用街区吗?