我有一个视图控制器,我想懒洋洋地初始化,一旦初始化,尽可能使用相同的副本(我不使用单例,因为我想最终从内存中删除它),我使用getter这样做,我的代码看起来像这样:
@property (retain) UIViewController *myController
...
@synthesize myController = _myController;
...
- (UIViewController *)myController
{
if (!_myController) { // Evaluation
_myController = [[MyViewController alloc] init]; // Object Creation
}
return _myController;
}
Run Code Online (Sandbox Code Playgroud)
这可行,但它不是线程安全的,如果在创建对象之前多个线程评估为true,我将有内存泄漏.我尝试过的一个解决方案是@synchronized代码,但我不确定正确的方法.
这似乎工作,(lockForMyController是一个简单的NSString)但它使这部分代码慢了很多:
- (UIViewController *)myController
{
@synchronized(self.lockForMyController){
if (!_myController) {
_myController = [[MyViewController alloc] init];
}
}
return _myController;
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有其他方法来实现延迟初始化,线程安全,属性?