Pregunta

Tengo muchos problemas con la desasignación prematura de los objetos NSDate. Sospecho que los problemas pueden estar relacionados con la forma en que trato con los objetos devueltos por los métodos de conveniencia de NSDate. Creo que mi declaración de propiedad showDate en la clase JKShow debería ser " conservar " ;, pero cambiarla para asignar o copiar parece no tener efecto en el problema.

JKShow *show; 
NSDate *date;
NSMutableArray *list = [[NSMutableArray alloc] init];

// Show 1
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

// Show 2
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

UPDATE

El problema no estaba en el código copiado aquí. En mi método JKShow init no estaba reteniendo la fecha devuelta por el método de conveniencia NSDate . Gracias por su ayuda, todos.

¿Fue útil?

Solución 4

Lo descubrí, gracias por toda tu ayuda, pero el problema estaba fuera del código que publiqué aquí. No estaba reteniendo el NSDate que creé en mi método init. Desafortunadamente, el bloqueo no se produjo hasta después de haber creado los dos nuevos objetos NSDate , por lo que estaba ladrando totalmente el árbol equivocado.

Otros consejos

La fecha devuelta desde dateFromComponents debe estar en el grupo de autorelease, por lo que es correcto que su propiedad showDate debe estar " conservar " ;. De hecho, debería ser de todos modos (a menos que desee específicamente " copiar ").

A partir del código que ha mostrado, parece que le está otorgando la propiedad de su objeto de show completamente a la lista (a medida que establece el autorelease en ellos a medida que los agrega). ¿Está diciendo que los objetos de fecha se desasignan antes de que los objetos de la demostración salgan de la lista (o que la lista se desasigne)?

Además, ¿estás usando propiedades sintetizadas o las estás escribiendo a mano? Si es lo último, ¿cómo es su método de propiedad setShowDate?

También puedes intentar registrar el retenerCuenta del objeto de fecha en diferentes lugares (aunque siempre encuentro que el autorelease realmente complica eso).

Si showDate es una propiedad de retención que debería ser suficiente, dado el código que has publicado. Algo más (probablemente en la implementación de JKShow) puede no ser correcto.

Si desea averiguar qué está sucediendo, puede usar Instrumentos para examinar la vida útil de los objetos. Debe ejecutarlo con el conjunto de herramientas de asignación para recordar retenciones y lanzamientos. De forma predeterminada, está configurado de esa manera si ejecuta la herramienta de rendimiento de fugas.

Cuando ejecute instrumentos como ese, se registrarán todos los períodos de vida del objeto, y el seguimiento de cada retención y liberación emitida contra ellos. Si observa los objetos, encuentra una de sus fechas y observa todas las retenciones y liberaciones, debería poder determinar dónde está ocurriendo la liberación falsa.

El código que mostró no tiene problemas de liberación prematura. De hecho, filtrará la matriz y todo lo que contiene, porque no libera la matriz.

¿Está ejecutando con el recolector de basura activado?

¿Es list una variable de instancia o una variable estática, o es una variable local?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top