Ios 如何在“init”中初始化线程安全变量?

Ios 如何在“init”中初始化线程安全变量?,ios,objective-c,multithreading,synchronization,thread-safety,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; } 如果在init完成并返回后,从第二个线程调用方法object,我如何知道init中对\u

我有以下代码:

{
    NSObject *_object;
}

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

    return self;
}

- (NSObject*)object {
    return _object;
}
如果在
init
完成并返回后,从第二个线程调用方法
object
,我如何知道
init
中对
\u object
的赋值将是可见的,并且实际上不会返回未赋值指针


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

代码的线程安全性取决于它的使用方式,而它的使用方式本质上是线程安全的。您不应该传递部分构造的对象,因此分配和初始化(
[[…alloc]init]
new
)应该限制在单个线程中,然后传递给其他线程。

代码的线程安全性取决于它的使用方式,它的使用方式本质上是线程安全的。您不应该传递部分构造的对象,因此分配和初始化(
[[…alloc]init]
new
)应该限制在一个线程中,然后传递给其他线程。

使用
调度一次
。无论有多少线程,都保证只运行一次。比如说

+ (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;
}

使用
dispatch\u一次
。无论有多少线程,都保证只运行一次。比如说

+ (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;
}

我不关心数组的内容。那是另一个问题。我的问题是关于
init
\u数组
赋值的可见性。如果我在线程A中调用
init
,并在线程B中调用该方法,该方法是否保证在
\u array
中看到
nil
。我指的不是内容,而是在
init
中初始创建的数组。我的意思是,在
init
方法中不需要锁定机制。它是如何部分构造的<代码>[NSMutableArray]创建并返回空数组。这就是我要检索的对象。我的意思是,即使在
init
完成并返回之后,它如何保证对
\u array
的赋值对所有其他线程都立即可见,除非
init
之后存在内存障碍?它不是部分构造的,我想说的是,使用类的代码应该调用
alloc/init
new
来完全构造对象,此时由于线程限制,代码是线程安全的。我不关心数组的内容。那是另一个问题。我的问题是关于
init
\u数组
赋值的可见性。如果我在线程A中调用
init
,并在线程B中调用该方法,该方法是否保证在
\u array
中看到
nil
。我指的不是内容,而是在
init
中初始创建的数组。我的意思是,在
init
方法中不需要锁定机制。它是如何部分构造的<代码>[NSMutableArray]创建并返回空数组。这就是我要检索的对象。我的意思是,即使在
init
完成并返回之后,它如何保证对
\u array
的赋值对所有其他线程都立即可见,除非
init
之后存在内存障碍?它不是部分构造的,我想说的是,使用类的代码应该调用
alloc/init
new
来完全构造对象,此时由于线程限制,代码是线程安全的。