2009-10-29 21 views
6

Estoy a punto de concluir mi primera aplicación de iPhone y pensé que la ejecutaría a través de la herramienta de rendimiento de Leaks. Después de corregir uno obvio, el único que me queda es uno con un Nib que actúa como una vista de encabezado de tabla cargada a través de loadNibNamed (estaba siguiendo la demostración de Recetas aquí).¿Hay pérdida de memoria en loadNibNamed?


- (void)viewDidLoad { 
    [super viewDidLoad]; 

    if (self.tableHeaderView == nil) { 
     [[NSBundle mainBundle] loadNibNamed:@"TableHeaderView" owner:self options:nil]; 
     self.tableView.tableHeaderView = self.tableHeaderView; 
    } 
} 

Luego, en dealloc:


- (void)dealloc { 
    [tableHeaderView release]; 
    [super dealloc]; 
} 

Instrumentos me dice que estoy fugas de 256 bytes con 2 fugas procedentes de la línea con loadNibNamed. tableHeaderView es el único objeto de nivel superior en el Nib (lo he verificado en el depurador). ¿Hay algo que me estoy olvidando de lanzar? ¿Estoy malinterpretando lo que Instruments me está diciendo? ¿Esta mal? ¿Es algo que el sistema operativo limpiará más tarde?

+1

No tiene NSZombieEnabled, ¿o sí? Eso mostrará falsas filtraciones en los instrumentos. – nall

+0

No, si eso es algo que hubiera tenido que salir de mi camino para hacer. ¿Está apagado por defecto? – AndrewO

+0

Buena llamada. Me estaba volviendo loco por esto. Tenía zombies encendidos. – RyeMAC3

Respuesta

2

¿Los instrumentos le indican esto únicamente en el simulador o informa lo mismo en un dispositivo real? Si no lo obtiene en el dispositivo, entonces es el Simulador, y eso se sabe que ocurre (no es una coincidencia exacta).

Además, abajo en dealloc, ¿no sería [self.tableHeaderView release]? Tienes que ser coherente con tu uso.

Para evitar confusiones, en su .h, que le declara esto:

NS/UI/??xxxxxx *_MyObjectName; //notice the underscore 

entonces la propiedad de esta manera:

@property .... NS/UI/??xxxxxx *MyObjectName; //no underscore 

A continuación sintetizan los getters/setters como esto:

@synthesize MyObjectName=_MyObjectName; 

Por último, consulte el objeto en todo el programa con [self.MyObjectName ...];

+0

Buena pregunta sobre el dispositivo: estoy en el proceso de configurar mi dispositivo para que realmente lo pruebe allí; lo actualizaré cuando lo tenga funcionando. Traté de cambiar la llamada de liberación en dealloc para usarlo y no hubo cambios. Pensé que había leído en alguna parte que se suponía que debía evitar el azúcar de la propiedad en dealloc (aunque supongo que llamarlo sin identidad no sería mejor). ¿O eso solo fue setters? – AndrewO

+0

Tiendo a dejar intacta la versión local de una propiedad a menos que tenga que hacerlo (como si fuera de solo lectura). De lo contrario, siempre tengo acceso consigo mismo. Sugiero mirar las muestras de Apple, pero incluso la primera aplicación de aprendizaje exhibe las mismas debilidades. Por lo menos: si mantiene esta disciplina, puede, más adelante, hacer una búsqueda/reemplazo para cambiar a otra cosa. ¡Tenga razón o esté equivocado, solo hágalo de forma constante! Diviértete con el perfil del dispositivo. La firma de código para el lanzamiento también es divertida. La mejor apuesta es usar la guía de Apple, realmente. – inked

+0

¿Cuál es el propósito del guión bajo? – RyeMAC3

5

Cuando carga una punta, usted es responsable de liberar todos los objetos de nivel superior en el archivo de punta. ¿Hay algo en ese archivo además de TableHeaderView?

+0

No, he verificado que es el único objeto de nivel superior en el archivo de punta. – AndrewO

+0

Parece que sabe de lo que está hablando, pero no he encontrado esto documentado en ninguna parte. De hecho, los documentos para el estado loadNibNamed "Debes conservar el conjunto devuelto o los objetos que contiene manualmente para evitar que los objetos del archivo nib se liberen prematuramente". - ¿Puedes por favor elaborar/referencia? 10x! –