Si utilizo @property (retener) Algo * myVar; Puedo acceder a esa variable con self.myVar ... Pero, ¿cuál es la diferencia?
@property (retain) Something *myVar;
// this property declaration declares:
- (Something *)myVar;
// and
- (void)setMyIvar:(Something *)arg;
// and is accessible by dot syntax.
// it also declares and/or documents how the ivar is managed (copy, retain, etc.)
en uso:
// direct access to the ivar. zero additional overhead (with regard to accessing the ivar)
[myVar message];
// properties used with dot syntax invoke the accessor. therefore,
[self.myVar message];
// is the same as:
[[self myVar] message];
las propiedades de la propiedad también se dan instrucciones al compilador cuanto a la forma de sintetizar un descriptor de acceso.
¿Hay alguna buena razón para usar uno u otro método?
en init y dealloc, acceda al ivar directamente - le interesa la inicialización y la limpieza de los ivars del objeto y no le importan las subclases. el uso de propiedades aquí también puede introducir errores o un comportamiento indefinido.
para otros casos, es decir, cuando el objeto está en un estado totalmente construido, siempre debe usar el acceso para coherencia.si una subclase anula un descriptor de acceso, el acceso directo del ivar podría romper los diseños.
si desea evitar esto, haga que el ivar sea privado y no declare una propiedad para él. si declara una propiedad para ella, entonces documente que es privada; Por lo general, escribiré @property (retain) Something * private_myIvar;
en este caso. en este caso, es conveniente usar una propiedad para sintetizar la administración de la memoria del ivar.
cuando el ivar es privado, tiene acceso total a él. es seguro acceder directamente o por propiedad privada. de lo contrario, suponga que debe usar el descriptor de acceso.
si myIvar se declara privado y se creará solo durante la inicialización, puede evitar declarar las propiedades por completo. esto reducirá la sobrecarga de tiempo de ejecución (si eso es crítico). la sobrecarga de mensajería, los ciclos de retención/liberación y los atómicos requerirán (naturalmente) más tiempo de ejecución. por lo que se puede pasar por alto para mejorar el rendimiento.
visibilidad/mantenimiento. a veces, es mucho menos mantenimiento/implementación para ocultar un ivar de la interfaz. en otros casos, el ivar es un detalle de implementación de la clase y no debe formar parte de la interfaz pública. en tales casos, considere la posibilidad de hacerlo privado (hay algunas formas de justificar esto en objc).
Creo que tiene que ver con si desea o no crear métodos getter/setter, pero no me cite sobre eso. Es de conocimiento común entre los veteranos del cacao, estoy seguro de que alguien responderá esto pronto :) –