У меня есть контроллер представления, который я хочу лениво инициализировать, и после инициализации по возможности использую ту же копию (я не использую синглтон, так как хочу удалить его из память в конечном итоге), я использую для этого геттер, мой код выглядит следующим образом:
@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;
}
Мне было интересно, есть ли какой-нибудь другой способ получить ленивое инициализированное, потокобезопасное свойство?