objective-c ios5 initialization automatic-ref-counting reference-counting

objective c - ¿Debo referirme a self.property en el método init con ARC?



objective-c ios5 (3)

No estoy seguro de en qué punto de la inicialización del objeto las propiedades se vuelven accesibles con la notación de puntos.

Dado que la notación de puntos sigue siendo un método Objective-C (y un método C en realidad bajo el método ObjC), la notación de puntos, o llamando al método, es perfectamente segura. DADO el método está preparado para tratar con tipos subyacentes en la memoria cualquiera que sea el estado en el que se encuentren. La regla normal sobre evitar el uso de un segmento de memoria de garaje no desinitilizado (posiblemente) aún se aplicaría. Cuál es la motivación más fuerte para el uso del ivar en el init.

Pero si su método (getter | setter) es capaz de usar correctamente el segmento de memoria, independientemente de si se escribió antes o no antes de ser leído, entonces use su getter en el método init. Un getter Lazy se aprovecha de la suposición de que un puntero que inicializará comienza como ''nil'' para decidir realizar la inicialización. Si no puede asumir los contenidos iniciales de su memoria, entonces inicializar el ivar podría ser el curso más seguro.

¿Por qué la regla de nunca usar setters o getters en el init si el método es capaz de operar correctamente en este escenario?

Una pregunta rápida.

si tengo una propiedad y un ivar declarado con el mismo nombre:

en el archivo .h:

(Reminder*)reminder; @property(nonatomic,strong)(Reminder*)reminder;

en el archivo .m, ¿debería usar el ivar o la propiedad en el método init si estoy usando ARC?

- (id)initWithReminder:(Reminder*)reminder_ { self = [super init]; if (self) { reminder = reminder_; } return self; }

¿O debería usar la propiedad para obtener el beneficio del conteo automático de referencias como este:

- (id)initWithReminder:(Reminder*)reminder_ { self = [super init]; if (self) { self.reminder = reminder_; } return self; }

No estoy seguro de en qué punto de la inicialización del objeto las propiedades se vuelven accesibles con la notación de puntos.


No, no deberías!

Puede encontrar la descripción por qué here
También Apple recomienda no hacerlo. Leer aquí


Utilice el acceso directo en estados parcialmente construidos, independientemente de ARC:

- (id)initWithReminder:(Reminder*)reminder_ { self = [super init]; if (self) { reminder = reminder_; // OR reminder = [reminder_ retain]; } return self; }

Esto se debe a que self.whatever desencadenará otros efectos secundarios, como notificaciones de Observación de valores-clave (KVO), o tal vez su clase implementa (explícitamente) o una subclase anula setWhatever: - y eso podría exponer su instancia parcialmente inicializada a otras API (incluido el suyo propio), que correctamente asumen que están tratando con un objeto completamente construido.

Puede verificar manualmente que una clase es capaz de operar en un estado parcialmente inicializado, pero eso requiere mucho mantenimiento y es (francamente) poco práctico o imposible cuando otras personas quieren subclasificar su clase. Requiere mucho tiempo y mantenimiento, y no hay un beneficio sustancial al hacerlo, especialmente si intenta utilizar el enfoque como una convención.

Entonces, la manera uniforme que garantiza la corrección es usar el acceso directo en estados parcialmente construidos, y evitar el uso de los accesorios.

Nota: Estoy usando "parcialmente construido" porque la inicialización es solo la mitad de la imagen; -dealloc tiene advertencias similares.

Más detalles sobre por qué debería usar el acceso directo en estados parcialmente construidos (ARC || MRC) se pueden encontrar aquí: Inicializando una propiedad, notación de puntos