alguna parte he leído que - en cuanto a las advertencias de poca memoria y renunciar a una vista no visible gracias a todas sus subvistas (= toda una punta, creo), usted debe hacer lo siguiente:¿Por qué debería escribir [anView release], anView = nil; en lugar de [anView release] ;?
-(void)dealloc {
[anView release], anView = nil;
[someImageView release], someImageView = nil;
[super dealloc];
}
en lugar de
-(void)dealloc {
[anView release];
[someImageView release];
[super dealloc];
}
¿Cuál es la razón para poner a tierra esos punteros a nil (= "no object"), después de que llame al lanzamiento? Déjame adivinar: Algún otro método podría haber retenido la vista por alguna razón (¿alguien puede dar algún ejemplo de cuándo podría suceder esto?), Entonces sucede lo que ocurre en la memoria de recuperación de documentos, y liberas una vista de plumín + que no está visible (es decir, en una aplicación multiview). Tan pronto como el usuario quiera volver a ver esa vista, cargará rápidamente la punta de nuevo y luego: ¡Cargará todas las vistas, conectará las tomas y BANG! Las otras vistas retenidas cuelgan ahora sin ningún puntero en algún lugar solitario en el panel de memoria, lo que provoca una pérdida de memoria abundante y gruesa hasta que la aplicación se cuelga.
¿Derecha/Incorrecta?
No. Esto es * explícitamente * prohibido por Apple, y una buena manera de causar un bloqueo en algunas circunstancias. Ver http://stackoverflow.com/questions/192721/why-shouldnt-i-use-obective-c-2-0-accessors-in-init-dealloc –
Ese enlace trae a colación un buen punto, pero ¿sigue siendo un mala idea si solo la usa para las propiedades readwrite que están totalmente sintetizadas? (lo que significa que no declaras la sintetización para una propiedad y aún anulas el getter o setter) – Kevlar
Probablemente esté bien, por ahora, con propiedades totalmente sintetizadas. Pero Apple no garantiza que esté permitido y recomienda no hacerlo, por lo que podría romperse en cualquier SDK futuro. –