如何在`init`中初始化线程安全变量?

时间:2015-03-18 13:09:08

标签: ios objective-c multithreading synchronization thread-safety

我有以下代码:

{
    NSObject *_object;
}

- (instancetype)init {
    if (self = [super init]) {
        _object = [[NSObject alloc] init];
    }

    return self;
}

- (NSObject*)object {
    return _object;
}

如果在object完成并返回后从第二个帖子调用方法init,我怎么知道_objectinit的分配是可见的,它实际上并没有返回一个未分配的指针?

保证这一点的内部机制是什么?

2 个答案:

答案 0 :(得分:3)

代码的线程安全性取决于它的使用方式,以及如何使用它本身就是线程安全的。你不应该绕过部分构造的对象,因此分配和初始化([[... alloc] init]new)应该被限制在一个线程中,然后传递给其他线程。

答案 1 :(得分:1)

使用dispatch_once。无论有多少线程,这都保证只运行一次。例如

+ (MyClass *)sharedInstance
{
    //  Static local predicate must be initialized to 0
    static MyClass *sharedInstance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyClass alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}