2009-11-24 38 views
6

Tengo un juego de clase de datos básicos que tiene una relación de muchos a otro jugador de clase. Esto es lo que sus cabeceras parecenDatos básicos y ciclos de retención

@property (nonatomic, retain) NSSet * players; // In Game.h 
@property (nonatomic, retain) Game * game; // In Player.h (the inverse relationship) 

Cuando estoy lanzando la última referencia externa que tengo a la clase de juegos, didTurnIntoFault no está siendo llamado. Ahora, mi pregunta es si esto podría deberse a la referencia cíclica creada anteriormente (como puede ver, ambas propiedades son 'retener'), o los datos centrales administran todo eso y el problema está en algún lugar de mi código.

Respuesta

4

Ver Core Data Programming Guide: Memory Management (Breaking Relationship Retain Cycles).

Cuando tiene relaciones entre objetos gestionados, cada objeto mantiene una fuerte referencia al objeto u objetos con los que está relacionado. En un entorno de memoria administrada, esto provoca ciclos de retención (consulte Object Ownership and Disposal) que pueden evitar la desasignación de objetos no deseados. Para asegurarse de que los ciclos de retención estén interrumpidos, cuando haya terminado con un objeto, puede usar el método de contexto de objeto administrado refreshObject:mergeChanges: para convertirlo en un error.

Normalmente usa refreshObject:mergeChanges: para actualizar los valores de propiedad de un objeto administrado. Si el indicador mergeChanges es YES, el método combina los valores de propiedad del objeto con los del objeto disponible en el coordinador de almacenamiento persistente. Sin embargo, si el indicador es NO, el método simplemente convierte un objeto en un error sin fusión, lo que hace que libere objetos gestionados relacionados. Esto rompe el ciclo de retención entre ese objeto gestionado y los otros objetos gestionados que había retenido.

+0

Puedo jurar que me RTFM, sin embargo, me echaron de menos :) ¡Gracias de todos modos! – Manav

+2

¿Puedo agregar que tiene que hacer esto recursivamente? Romper los ciclos de un objeto administrado NO rompe automáticamente ningún ciclo que los objetos de los niños puedan tener entre ellos. – Manav

Cuestiones relacionadas