Apple recomienda que no llame a setters en las rutinas init y especialmente dealloc.
Esto se debe al hecho de que el objeto está parcialmente configurado en este momento, y los instaladores podrían tener observadores unidos, o podrían ser reemplazados por subclases, y tener efectos indeseables durante el desalojo, o podrían confundirse durante init con un objeto parcialmente configurado.
Por lo tanto, se utiliza normalmente:
_navigationController = [[NavController alloc] init];
código de estilo en su rutina de inicio, el código
[_navigationController release];
estilo en su dealloc y setters en otro código donde el objeto es conocido por ser totalmente completar.
algunos casos a considerar:
- Subclase anula setNavigationController y hace referencia a sus propias Ivars asignados por init. Crash en init.
- La subclase anula setNavigationController y hace referencia a sus propios ivars publicados en dealloc. Crash en dealloc.
- La subclase anula setNavigationController y vuelve a dibujar algunas partes de la pantalla. El desperdicio de ciclos sin sentido, o la pantalla glitchy.
- Otros objetos que se cancela la asignación al mismo tiempo observar navigationController y los observadores fuego durante dealloc
- etc
Gracias, por lo que en ese caso el código viewDidUnload podría haber utilizado el mismo código que dealloc para liberar el objeto, es decir, [_navigationController release] en lugar de configurarlo a cero, ¿verdad? – Boon
Sí, pero no es así. Utilice el accesorio en todas partes excepto en -dealloc. El uso de accesadores en -dealloc es controvertido por las razones que dio Daniel (Apple no está claro en lo que recomiendan, también). Adquiera el hábito de liberar todos sus ivars retenidos en -dealloc. No apueste por otra cosa para hacerlo por usted. Y cada vez que suelte algo, configúrelo en cero. Gran parte de ObjC no tiene una red de seguridad; los buenos hábitos son los que mantienen sus programas en funcionamiento porque el compilador no lo salvará. (OK, tal vez Clang finalmente nos salvará, pero solo usará su poder para siempre.) –