Eiko y otros dieron respuestas correctas.
He aquí una forma más sencilla: acceda directamente a la variable de miembro privado.
Ejemplo
En el archivo .h de encabezado:
@property (strong, nonatomic, readonly) NSString* foo;
En el archivo .m de implementación:
// inside one of my init methods
self->_foo = @"someString"; // Notice the underscore prefix of var name.
Eso es todo, eso es todo lo que necesitas. Sin despeinarse sin problemas.
Detalles
A partir de Xcode 4.4 y LLVM Compiler 4.0 ( Nuevas características en Xcode 4.4 ), no necesita meterse con las tareas discutidas en las otras respuestas:
- La
synthesize
palabra clave
- Declarar una variable
- Volver a declarar la propiedad en el archivo .m de implementación.
Después de declarar una propiedad foo
, se puede asumir Xcode ha añadido una variable miembro privada llamada con un prefijo de subrayado: _foo
.
Si la propiedad fue declarada readwrite
, Xcode genera un método getter llamado foo
y un setter llamado setFoo
. Estos métodos se llaman implícitamente cuando usa la notación de puntos (my Object.myMethod). Si la propiedad fue declarada readonly
, no se genera ningún setter. Eso significa que la variable de respaldo, nombrada con el guión bajo, no es de solo lectura. Esto readonly
significa simplemente que no se sintetizó ningún método de establecimiento y, por lo tanto, el uso de la notación de puntos para establecer un valor falla con un error del compilador. La notación de puntos falla porque el compilador le impide llamar a un método (el establecedor) que no existe.
La forma más sencilla de evitar esto es acceder directamente a la variable miembro, nombrada con el guión bajo. ¡Puede hacerlo incluso sin declarar esa variable con el nombre de subrayado! Xcode está insertando esa declaración como parte del proceso de compilación / compilación, por lo que su código compilado tendrá la declaración de variable. Pero nunca ve esa declaración en su archivo de código fuente original. No magia, solo azúcar sintáctica .
El uso self->
es una forma de acceder a una variable miembro del objeto / instancia. Es posible que pueda omitir eso y solo use el nombre var. Pero prefiero usar la flecha self + porque hace que mi código se autodocumente. Cuando ve el self->_foo
, sabe sin ambigüedad que _foo
es una variable miembro en esta instancia.
Por cierto, la discusión sobre los pros y los contras de los accesores de propiedad versus el acceso directo a ivar es exactamente el tipo de tratamiento reflexivo que leerá en Dr. Matt Neuberg 's Programación iOS libro. Me resultó muy útil leer y releer.