私はマイク・アッシュの「シングルトンのケアと給餌」でこれに出くわし、彼のコメントに少し戸惑いました:
ただし、このコードは少し遅いです。ロックを取得するには、多少のコストがかかります。それをより苦痛にしているのは、ほとんどの場合、ロックが無意味であるという事実です。ロックが必要になるのは、foo が nil の場合だけです。これは、基本的に 1 回だけ発生します。シングルトンが初期化されると、ロックは必要なくなりますが、ロック自体は残ります。
+(id)sharedFoo {
static Foo *foo = nil;
@synchronized([Foo class]) {
if(!foo) foo = [[self alloc] init];
}
return foo;
}
私の質問は、これには間違いなく正当な理由がありますが、foo が nil のときにロックを制限するように記述できないのはなぜですか (以下を参照)。
+(id)sharedFoo {
static Foo *foo = nil;
if(!foo) {
@synchronized([Foo class]) {
foo = [[self alloc] init];
}
}
return foo;
}
乾杯ゲイリー