我在 Mike Ash “单身人士的照顾和喂养”中遇到了这个问题,他的评论让我有些困惑:
不过,这段代码有点慢。拿锁有点贵。更痛苦的是,在绝大多数情况下,锁是没有意义的。只有当 foo 为 nil 时才需要锁,这基本上只发生一次。初始化单例后,不再需要锁,但锁本身仍然存在。
+(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;
}
干杯加里