0

У меня есть следующий код:Как инициализировать потокобезопасную переменную в `init`?

{ 
    NSObject *_object; 
} 

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

    return self; 
} 

- (NSObject*)object { 
    return _object; 
} 

Если метод object вызывается из второго потока после init завершил и вернулся, как я знаю, что назначение на _object в init будет видно, и это на самом деле не возвращается неназначенный указатель?

Каков внутренний механизм, который гарантирует это?

ответ

3

Безопасность потока вашего кода зависит от того, как он используется и как он предназначен для использования, по своей сути является поточно-безопасным. Вы не должны проходить вокруг частично построенных объектов, поэтому распределение и инициализация ([[... alloc] init] или new) должны быть ограничены одним потоком и затем передаваться другим потокам.

+0

Меня не интересует содержимое массива. Это отдельная проблема. Мой вопрос касается видимости задания '_array' в' init'. Если я 'init' в потоке A и вызывается метод в потоке B, это метод, гарантирующий, что вы увидите' nil' для '_array'. – Monstieur

+0

Я не имею в виду содержимое, я имею в виду первоначальное создание массива в 'init'. То, что я получаю, не нуждается в механизме блокировки в вашем методе 'init'. – Joe

+0

Как это частично построено? '[NSMutableArray array]' создает и возвращает пустой массив. Это объект, который я хочу получить. – Monstieur

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

Запуск только один раз! = Видимый для других тем. – Monstieur

Смежные вопросы