这个dispatch_once单例能否返回nil?

时间:2015-06-28 13:56:35

标签: ios objective-c grand-central-dispatch

试图找到我们间歇性遇到的问题,这似乎发生在内存条件较差的设备上。可疑原因是NSDateFormatter单例为零。

是否存在以下单身模式可能返回nil的可能情况?

+ (NSDateFormatter *)dateFormatterUTC {

    static NSDateFormatter *formatter;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat=@"yyyy-MM-dd HH:mm:ss ZZZ";
    });

    return formatter;
}

1 个答案:

答案 0 :(得分:1)

如果你没有做一些奇怪的事情那么没有。

有两种情况如何返回nil:

  1. 在实例化日期格式化程序时,alloc或init方法返回nil。如果没有可用的堆内存,则可能发生这种情况。但在这种情况下,你的程序很可能会崩溃。大多数Objective-C代码(可能包括Apples框架)是在堆内存无法用完的假设下编写的。

  2. 有人用nil覆盖静态指针,但将onceToken留在原位。这不太可能偶然发生,但并非不可能。像这样的内存损坏错误可能也会破坏其他内容并使应用程序崩溃。

  3. 因此,出于所有实际目的,您可以假设您的函数将始终返回有效对象。如果你真的想确保你也可以在返回之前添加一个断言。