+(void)initialize方法中的alloc-init对象可以多次重用它们

时间:2012-05-09 11:28:18

标签: objective-c ios code-reuse lazy-initialization

我正在使用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是否正确。

提前谢谢。

2 个答案:

答案 0 :(得分:4)

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

static NSDateFormatter *sharedInstance = nil;

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

注意:这些类称为单例。 Read more

答案 1 :(得分: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时必须要小心一点。它在第一次使用该类之前调用​​过一次。如果你从不使用该类,它将永远不会被调用。因此,要使您的代码正常工作,您必须确保在开始使用共享实例NSDateFormatter之前向dateFormatternil 的实例发送消息 。请注意,向dateFormatter发送消息本身不计算。这是因为它从{{1}}开始,因此没有类。