Потоковая отложенная инициализация в iOS

У меня есть контроллер представления, который я хочу лениво инициализировать, и после инициализации по возможности использую ту же копию (я не использую синглтон, так как хочу удалить его из память в конечном итоге), я использую для этого геттер, мой код выглядит следующим образом:

@property (retain) UIViewController *myController

...

@synthesize myController = _myController;


...


- (UIViewController *)myController
{
    if (!_myController) {                                 // Evaluation
        _myController = [[MyViewController alloc] init];  // Object Creation
    }
    return _myController;
}

Это работает, но не потокобезопасно, и если более одного потока оценивают значение true до создания объекта, у меня будет утечка памяти. Одно из решений, которое я пробовал, - это @synchronized кода, но я не уверен, как это сделать.

Похоже, что это работает (lockForMyController - это простой NSString), но он делает этот раздел кода намного медленнее:

 - (UIViewController *)myController
{
    @synchronized(self.lockForMyController){
        if (!_myController) {
            _myController = [[MyViewController alloc] init];
        }
    }
    return _myController;
}

Мне было интересно, есть ли какой-нибудь другой способ получить ленивое инициализированное, потокобезопасное свойство?

6
задан Yamanqui 22 October 2011 в 00:58
поделиться