私は遅く初期化したい、一度初期化すると、可能な限り同じコピーを使用します(私はシンクトンを使用しません。 、私はそうするゲッターを使用して、私のコードは次のようになります。iOS上でのスレッドセーフな遅延初期化
@property (retain) UIViewController *myController
...
@synthesize myController = _myController;
...
- (UIViewController *)myController
{
if (!_myController) { // Evaluation
_myController = [[MyViewController alloc] init]; // Object Creation
}
return _myController;
}
これは動作しますが、それはスレッドセーフではないですし、オブジェクトが作成される前に、複数のスレッドがtrueに評価された場合、私は持っていますメモリリーク私が試みた1つの解決策は、コードを同期させることですが、正しい方法はありません。
これは、動作しているように見えます(lockForMyControllerがシンプルNSStringのである)が、それは多くの、より遅いコードのこのセクションを行います
- (UIViewController *)myController
{
@synchronized(self.lockForMyController){
if (!_myController) {
_myController = [[MyViewController alloc] init];
}
}
return _myController;
}
怠惰な初期化され、スレッドを達成するために他のいくつかの方法がある場合、私は思っていました安全な、財産ですか?
私はそれに慣れています。私はシングルトンのように動作させることができますが、 '[_myController release]を使うと問題があります。 _myController = nil; 'その後、私は' static dispatch_once_t once'変数をリセットすることができないので、再度作成しようとしています。 – Yamanqui
ええと私の質問をうまくいくはずです。 – logancautrell
ありがとう、更新されたソリューションは完全に動作します。 – Yamanqui