Почему мне нужно сохранить результат NSDateFormatter dateFromString:

У меня есть NSDate*, который я храню как свойство с ключевым словом retain:

@property (nonatomic, retain) NSDate* startTime;

Я использую это следующим образом:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"h:mm a"];
startTime = (NSDate*)[[NSUserDefaults] standardUserDefaults] objectForKey:@"StartTimeKey"];
if (startTime == nil)
  startTime = [[dateFormatter dateFromString:@"8:00 am"] retain];

Почему мне нужно сохранить результат dateFromString: сообщение, но мне не нужно сохранять результат objectForKey:?

Я только что обновился до XCode 4.2 и теперь использую компилятор LLVM GCC 4.2. До обновления код работал нормально без сохранения. Теперь происходит сбой (позже в коде, когда я получаю доступ к свойству startDate) без сообщения сохранения.

2 ответа

Решение

Проблема в том, что вы написали это:

startTime = blah blah blah;

Вы устанавливаете переменную экземпляра startTime непосредственно. Если вы делаете это вместо этого:

self.startTime = blah blah blah;

тогда компилятор превратит это в это:

[self setStartTime:blah blah blah];

и автоматически сгенерированный метод установки сделает сохранение для вас.

Если вы делаете это:

@synthesize startTime = _startTime;

тогда переменная экземпляра будет названа _startTimeоблегчая использование свойства вместо непосредственного присвоения переменной экземпляра.

Ответ приведен в Руководстве по программированию управления памятью на стр. 11.

У вас есть объект, который вы создаете (то есть вам не нужно его сохранять, это было сделано). Вы создаете объект с помощью alloc, new, copy или mutablecopy.

В этом случае dateFormatter предоставляет вам новый объект, но, поскольку вы сами не вызывали alloc, new или copy, dateFormatter будет вызывать (обычно так, как это работает) автоматическое освобождение нового объекта NSDAte.

Но если бы вы устанавливали свое свойство с помощью методов установки и получения, у вас не было бы этой проблемы.

Другие вопросы по тегам