[英]Different ways to initialize singletons
在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;
}
当我在我的代码中尝试它时,它工作得很好,并且无需每次访问它之前都要检查它是否存在。 有什么理由不应该以这种方式创建单例吗?
就我而言, +initialize
是这样做的方法。 彼得· -allocWithZone:
( Peter Hosey)提出了其他一些建议(在-init
和-allocWithZone:
内部),以确保您不能实例化该类的多个实例。 因此,使其成为真正的单例类,而不仅仅是使其内部具有指向其自身特定实例的指针的类。
在+ initialize中初始化单例将始终分配实例。 如果实例需要大量资源(包括初始化时间,这将延长您的应用在状态启动时响应的时间)并且可能不被使用,则像您的示例中那样,延迟初始化是有意义的。
一路延迟初始化!
我更喜欢这种模式(类似于您的模式):
+ (id) sharedInstance {
static MyObject *sMyObject = nil;
if (!sMyObject) {
sMyObject = [[MyObject alloc] init];
}
return sMyObject;
}
- (oneway void) release {
// no-op
}
无需将其放在+(void)初始化中以获得单例,因为只有在您首次尝试使用该类时才会调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.