设置方法所需的静态对象的正确方法

时间:2011-06-01 17:31:45

标签: iphone objective-c cocoa-touch cocoa macos

我正在NSDate创建一个将NSDate转换为NSString的类别。它使用NSDateFormatter来执行此操作。我发现每次分配然后释放格式化程序会导致我的应用程序出现明显的延迟(这个类别经常使用),所以我更新了我的'format'方法看起来像这样:

- (NSString *)pretty
{   
    static NSDateFormatter *formatter = nil;

    if (formatter == nil)
    {
        formatter = [[NSDateFormatter alloc] init];
        [formatter setDateStyle:NSDateFormatterLongStyle];
        [formatter setTimeStyle:NSDateFormatterNoStyle];
    }

    return [formatter stringFromDate:self];
}

这是在Cocoa中处理静态变量的正确方法吗?这是否是泄漏(dealloc之后没有alloc)?做这样的事情会有更好的方法吗?谢谢!

2 个答案:

答案 0 :(得分:9)

您正在有效地创建单身人士。除非它不会在您的应用程序的整个运行会话中使用,否则不要担心内存使用。即使它只是间歇性地使用,留下一个日期格式化器也不会成为问题。

即。就像单身一样,不要担心在应用程序终止之前释放对象。

如果pretty从多个线程中被攻击(假设NSDateFormatter本身是线程安全的 - 我没有检查文档,因此,不编写代码验证线程安全性,然后你想保护初始化。

static dispatch_once_t onceMark;
static NSDateFormatter *formatter = nil;
dispatch_once(&onceMark, ^{
        formatter = [[NSDateFormatter alloc] init];
        [formatter setDateStyle:NSDateFormatterLongStyle];
        [formatter setTimeStyle:NSDateFormatterNoStyle];
});

答案 1 :(得分:-1)

我相信你应该保留格式化程序以免它被泄露,并且下次使用格式化程序时你可能会发生崩溃,可能是虚假的。

对于它的价值,我使用类别中的NSDateFormatter对象来做这件事,因为我也观察到NSDateFormatter分配正在减慢我的应用程序。