iphone NSManagedObject - правильный способ устранения? - PullRequest
7 голосов
/ 05 января 2011

У меня есть подкласс NSManagedObject, большинство свойств являются динамическими (созданными управляемым объектом), но у меня есть пара вспомогательных свойств, которые создаются как @ synthesize.

Как правильно выпускать эти объекты ??

- (void)didTurnIntoFault
{
     [self.randomVar release];
     [super didTurnIntoFault];
}

или

- (void)dealloc
{
     [self.randomVar release];
     [super dealloc];
}

Ответы [ 3 ]

11 голосов
/ 05 января 2011

Переопределите didTurnIntoFault и отпустите их там. Управляемые объекты не обязательно освобождаются, когда они повреждены.

Из документации :

Вам не рекомендуется переопределять dealloc или finalize, потому что didTurnIntoFault обычно является лучшим временем для сброса значений - управляемый объект не может быть восстановлен в течение некоторого времени после того, как он был превращен в отказ. Базовые данные не гарантируют, что либо dealloc, либо finalize будут вызываться во всех сценариях (например, при выходе из приложения); поэтому в эти методы не следует включать необходимые побочные эффекты (например, сохранение или изменение файловой системы, пользовательские настройки и т. д.).

6 голосов
/ 05 января 2011

Возможно, вы захотите поближе взглянуть на Руководство по программированию основных данных. Эти два отрывка имеют особое значение

Если вы определяете пользовательский экземпляр переменные, вы должны очистить эти переменные в didTurnIntoFault скорее чем сдать или завершить.

и

Как правило, вы не должны переопределять Удалите или завершите, чтобы очистить переходный процесс свойства и другие переменные. Вместо этого вы должны переопределить didTurnIntoFault.

4 голосов
/ 05 января 2011

[Это действительно должен быть комментарий, потому что я указываю на проблему, отличную от вопроса, но мне нужна функциональность форматирования кода].

Никогда не делай этого:

[self.randomVar release];

Это освобождает объект, на который указывает свойство, поддерживающее ivar, но не делает сам указатель нулевым. Это означает, что теперь у вас потенциально может быть висячий указатель, если в результате освобождения объект будет освобожден. Либо сделать это:

self.randomVar = nil;

или это

[randomVar release];  // assumes the property is backed by an ivar of the same name.
randomVar = nil;      // can be omitted if you are in dealloc

Первая форма предпочтительна везде, кроме dealloc.

...