2015-06-28 1 views
0

Попытка найти проблему, с которой мы сталкиваемся с перерывами, что происходит на устройствах с низким уровнем памяти. Предполагаемая причина: однородный NSDateFormatter равен нулю.Может ли этот dispatch_once singleton когда-либо возвращать нуль?

Есть ли какая-либо возможная ситуация, когда одноэлементный шаблон ниже может возвращать нуль?

+ (NSDateFormatter *)dateFormatterUTC { 

    static NSDateFormatter *formatter; 
    static dispatch_once_t onceToken; 

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

    return formatter; 
} 
+0

Насколько я знаю, я синглтон остаюсь на всю жизнь, но форматирование даты может вернуть дату, если оно не может правильно разобрать формат даты. – Andrea

+0

Вообще-то я бы сказал, нет, но нет любая строго принудительная гарантия того, что alloc вернет non-nil так, я знаю, это * возможно * ... Но на практике нет. – ipmcc

ответ

1

Если вы не делаете что-то странное, то нет.

Есть два случая, как это может вернуть ноль:

  1. Alloc или Инициализационные методы возвращают ноль, когда instanciating даты форматера. Это может случиться, если больше нет памяти кучи. Но в этом случае ваша программа, скорее всего, рухнет в любом случае. Большинство Objective-C-кода (возможно, включая рамки яблок) написаны в предположении, что память кучи не может закончиться.

  2. Кто-то перезаписал статический указатель нулем, но оставил onceToken на месте. Это вряд ли произойдет случайно, но не невозможно. Ошибка памяти, подобная этой ошибке, вероятно, также нарушит другие вещи и приведет к сбою приложения.

Итак, для всех практических целей вы можете предположить, что ваша функция всегда вернет действительный объект. Если вы действительно хотели убедиться, что вы также можете добавить утверждение перед возвращением.

Смежные вопросы