本质上,我最喜欢的模式是 mindw0rk 已经给出的模式(我对他的答案投了赞成票)。它的优点是您可以将方法放在一个类别中NSDateFormatter
。我会稍微修改一下:
+ (NSDateFormatter *)sharedInstance {
static NSDateFormatter *sharedInstance = nil;
if (sharedInstance == nil) {
sharedInstance = [[NSDateFormatter alloc] init];
}
return sharedInstance;
}
这样您就不会sharedInstance
在不先初始化的情况下无意中引用它。
如果您有多个共享实例,则可以使用不同的方法来获取每个实例,例如
+ (NSDateFormatter *)dateFormatterForFoo {
static NSDateFormatter *sharedInstance = nil;
if (sharedInstance == nil) {
sharedInstance = [[NSDateFormatter alloc] init];
}
return sharedInstance;
}
+ (NSDateFormatter *)dateFormatterForBar {
static NSDateFormatter *sharedInstance = nil;
if (sharedInstance == nil) {
sharedInstance = [[NSDateFormatter alloc] init];
}
return sharedInstance;
}
或者,如果每个自定义日期格式化程序都有自己的子类,它们都可以实现+sharedInstance
以返回正确类的对象。
或者你可以有一个日期格式化字典:
+ (NSDateFormatter *)customisedFormatterForKey: (NSString*) key {
static NSDictionary *sharedInstances = nil;
if (sharedInstance == nil) {
sharedInstance = [[NSDictionary alloc] initWithObjectsAndKeys: ....];
}
return [sharedInstance objectForKey: key];
}
我对这种方法有一些意见-initialize
。
你必须小心使用-initialize
. 它在第一次使用该类之前被调用一次。如果您从不使用该类,它将永远不会被调用。因此,要使您的代码正常工作,您必须确保在开始使用共享实例之前NSDateFormatter
发送消息或实例。请注意,向 dateFormatter 本身发送消息不算数。这是因为它开始了,因此没有类。NSDateFormatter
dateFormatter
nil