2011-01-05 3 views
7

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

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

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

или

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

ответ

11

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

От documentation:

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

+1

Fyi для людей вроде меня, которые смущены именем переопределения-- willTurnIntoFault никоим образом не указывает на ошибку или «ошибку», это просто термин CoreData для вывода объекта из обращения. – jpswain

6

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

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

и

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

4

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

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

[self.randomVar release]; 

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

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.