2011-01-05 14 views
7

Tengo una subclase de NSManagedObject, la mayoría de las propiedades son dinámicas (creadas por el objeto gestionado), pero tengo un par de propiedades auxiliares que se crean como @synthesize.iphone NSManagedObject - ¿La forma correcta de desasignar?

¿Cuál es la forma correcta de liberar estos objetos?

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

o

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

Respuesta

11

Anulación didTurnIntoFault y liberarlos allí. Los objetos administrados no son necesariamente desasignados cuando tienen una falla.

Desde el documentation:

, está desaconsejado anulando dealloc o finalize porque didTurnIntoFault es por lo general un mejor momento para borrar los valores-un objeto administrado no puede ser reclamado por algún tiempo después de que se ha convertido en una culpa. Core Data no garantiza que se llamará dealloc o finalize en todos los escenarios (como cuando la aplicación se cierra); por lo tanto, no debe incluir estos métodos en los efectos secundarios necesarios (como guardar o cambios en el sistema de archivos, preferencias del usuario, etc.).

+1

Fyi a personas como yo que están confundidas por el nombre de la anulación-- willTurnIntoFault no indica de ninguna manera un error o "error", es solo el término CoreData para sacar un objeto de la circulación. – jpswain

6

Es posible que desee echar un vistazo más de cerca a la Guía de programación de datos básicos. Estos dos pasajes son de particular relevancia

Si define instancia personalizados variables, se debe limpiar estos las variables en didTurnIntoFault en lugar de dealloc o finalizar.

y

Usted debe por lo general no anular dealloc o finalizar para despejar transitoria propiedades y otras variables. En su lugar, debe reemplazar didTurnIntoFault.

4

[Esto debería ser un comentario porque estoy señalando un problema diferente a la pregunta, pero quiero la funcionalidad de formateo del código].

Nunca haga esto:

[self.randomVar release]; 

que libera el objeto apuntado por el Ivar respaldo de la propiedad, pero no hace que el propio puntero nulo. Esto significa que ahora tiene potencialmente un puntero colgante si la liberación da como resultado que el objeto se desasigne. O bien hacer esto: se prefiere

self.randomVar = nil; 

o esta

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

La primera forma en cualquier lugar excepto en dealloc.

Cuestiones relacionadas