Почему мне нужно сохранить результат NSDateFormatter dateFromString: - PullRequest
0 голосов
/ 11 ноября 2011

У меня есть 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 ]

4 голосов
/ 11 ноября 2011

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

startTime = blah blah blah;

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

self.startTime = blah blah blah;

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

[self setStartTime:blah blah blah];

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

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

@synthesize startTime = _startTime;

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

1 голос
/ 11 ноября 2011

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

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

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

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

...