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

Stu*_*ssa 5 iphone macos cocoa cocoa-touch objective-c

我正在创建一个NSDate将a转换NSDate为a 的类别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];
}
Run Code Online (Sandbox Code Playgroud)

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

bbu*_*bum 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];
});
Run Code Online (Sandbox Code Playgroud)