1

NSDateFormatter多次使用一个对象(为特定目的定制)。由于我不是 objc 专家,因此我想出了三种不同的方法来处理它。

在第一个中,我创建了一个NSDateFormatter类别并在那里自定义了代码。这是一种常见的方法,但每次我创建这样一个对象时,它都会放在主自动释放池中。我认为这种行为对非 ARC 和 ARC 代码都有效。

在第二个中,我重写了该+(void)initialize方法并将自定义代码放在那里。这里有一个简单的例子:

static NSDateFormatter* dateFormatter = nil;

+(void)initialize
{
    dateFormatter = [[NSDateFormatter alloc] init];
    // other code here
}

最后,我通过如下属性设置了第三种方法,使用延迟加载实例化:

-(NSDateFormatter)dateFormatter
{
    if(dateFormatter) return dateFormatter;        
    // alloc-init here
}

说到这里,我想知道哪种方法最适合多次处理对象,以及+(void)initialize以这种方式使用是否正确。

先感谢您。

4

2 回答 2

4

后面两种方法都是正确的,但相信你想把它们放在一起!

static NSDateFormatter *sharedInstance = nil;

+ (NSDateFormatter *)sharedInstance {
    if (sharedInstance == nil) {
        sharedInstance = [[NSDateFormatter alloc] init];
    }
    return sharedInstance;
}

注意:这样的类称为单例。阅读更多

于 2012-05-09T11:42:22.413 回答
2

本质上,我最喜欢的模式是 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 dateFormatternil

于 2012-05-09T13:49:16.370 回答