2009-11-14 29 views
9

He leído las secciones de gestión de memoria en los documentos de Core Data y todavía estoy un poco confundido. Tengo un contexto en mi aplicación, y tengo varias cosas obteniendo objetos de él. Por ejemplo, algunos controladores de resultados obtenidos, vistas de detalle y algún otro código que busca objetos aleatorios. Una vez que los objetos se han liberado completamente y su conteo de retención es 0, ¿los datos centrales liberarán automáticamente toda la información del objeto y los fallarán?Core Data Memory Management

Estoy extrayendo muchos datos en mi contexto en algunos de mis controladores de resultados obtenidos, y quiero asegurarme de que, después de que el usuario haya terminado de desplazarse y tal vez haya profundizado en otra vista, esos objetos que se buscaron cuando se lanza la vista de tabla y se devuelve a error a la tienda?

Muchas gracias,

Mike

Respuesta

12

Core de datos gestiona objeto tiempos de vida de la misma forma el resto de Cocoa gestiona tiempos de vida de objeto: casos NSManagedObject en un contexto de objeto gestionado son retenidos en la memoria siempre que el contexto de objeto gestionado o cualquier otro objeto conserva la propiedad de ellos (a través -[NSObject retain]. Por defecto, el NSManagedObjectContext no conserva las instancias, por lo que se liberan tan pronto como otros propietarios (es decir, sus instancias NSFetchedResultsController u otras instancias en su programa) las liberan. Puede cambiar este comportamiento predeterminado del contexto del objeto gestionado para retener instancias, pero rara vez lo desea. El contexto del objeto administrado tiene para retener las instancias que se actualizan hasta el siguiente guardado. No hay forma de conservar estos cambios, excepto en la instancia del objeto hasta que se guarde el contexto. Por lo tanto, para minimizar el uso de la memoria de los objetos de Core Data, siga las reglas estándar: libérelos tan pronto como sea posible. Si encuentra que el uso de la memoria de contexto está creciendo (utilice los instrumentos de datos centrales de Instruments para rastrear esto), guarde el contexto con mayor frecuencia si está actualizando instancias y de este modo las mantiene vivas en el contexto hasta el próximo guardado aunque haya los liberó.

El uso de NSFetchedResultsController hace todo esto más fácil. De hecho, el motivo por el que NSFetchedResultsController existe es hacer que la búsqueda de lotes en un entorno de memoria baja (como el iPhone) sea más fácil para el programador.

Como mencionó Louis, el NSPersistentStoreCoordinator mantiene un caché de fila para almacenar en caché los datos de instancia en la memoria en lugar de tener que volver al disco cuando un objeto tiene una falla en el contexto del objeto administrado. Sin embargo, este es un detalle de implementación de Datos centrales (aunque los errores de caché son un golpe de rendimiento, puede rastrear errores de caché en Instrumentos). Core Data gestiona la memoria caché y no debería tener que preocuparse por ello.

4

Sí, CoreData criticarán las cosas de nuevo que no se está utilizando. Tiene cachés y varias otras cosas, por lo que es posible que los datos no se publiquen de inmediato, pero, en general, es muy útil para la administración de la memoria y para mantener su huella lo más pequeña posible.

Si tiene un perfil de uso particularmente extraño, puede forzar explícitamente objetos a fallas, pero eso generalmente no es necesario, y no consideraría hacerlo a menos que realmente tenga algunos datos de perfiles reales diciendo que estaba bajo presión de memoria.

+0

Gracias, solo quería asegurarme de que el controlador de resultados obtenido no iba a mantener cargas y montones de objetos en la memoria después de desplazarse por una lista larga y que permanecerían allí hasta que se guarde o se cancele el contexto. –