在C#和Java中工作,我基本上看到每个人初始化单身人士的方式:
static obj _inst = null;
obj getInstance() {
if (_inst == null) {
_inst = new obj();
}
return _inst;
}
现在,当我转向使用iPhone的Objective-C时,每当我看到代码示例时,我都会看到基本相同的东西:
static obj _inst = nil;
+ (obj *) sharedObj {
if (!_inst) {
_inst = [[obj alloc] init];
}
return _inst;
}
在使用之前,Objective-C运行时中的每个类都会调用一个类方法+initialize
。有什么理由我不能用它来创造我的单身人士吗?
static obj _inst = nil;
+ (void) initialize {
if (self == [obj class]) {
_inst = [[obj alloc] init];
}
}
+ (obj *) sharedObj {
return _inst;
}
当我在我的代码中尝试它时,它工作正常,并且它在每次访问之前都不会检查它是否存在。我有什么理由不这样做单身吗?
答案 0 :(得分:1)
就我而言+initialize
是做到这一点的方法。 Peter Hosey建议了几个其他捕获(在-init
和-allocWithZone:
内)以确保您无法实例化该类的多个实例。从而使它成为一个真正的单例类,而不仅仅是一个带有指向其中特定实例的指针的类。
答案 1 :(得分:0)
在+ initialize中初始化单例将始终分配实例。如果实例需要大量资源(包括初始化时间,这会延长应用程序在statup响应之前的时间)并且可能不会被使用,懒惰的初始化, 在你的例子中是有道理的。
答案 2 :(得分:0)
一直懒惰的初始化!
我更喜欢这种模式(类似于你所拥有的):
+ (id) sharedInstance {
static MyObject *sMyObject = nil;
if (!sMyObject) {
sMyObject = [[MyObject alloc] init];
}
return sMyObject;
}
- (oneway void) release {
// no-op
}
没有必要将它放在 +(void)初始化中用于单例,因为它只会在您第一次尝试使用该类时被调用。