Getter es un método que recibe llamadas cada vez que accede (lee el valor de) una propiedad (declarada con @property
). Sea lo que devuelve el método se considera el valor de esa propiedad:
@property int someNumber;
...
- (int)someNumber {
return 42;
}
...
NSLog("value = %d", anObject.someNumber); // prints "value = 42"
Setter es un método que se llama cada vez que se cambia el valor de la propiedad.
- (void)setSomeNumber: (int)newValue { // By naming convention, setter for `someValue` should
// be called `setSomeValue`. This is important!
NSLog("someValue has been assigned a new value: %d", newValue);
}
...
anObject.someNumber = 19; // prints "someValue has been assigned a new value: 19"
Por lo general, no tiene mucho sentido para simplemente devolver el mismo valor del captador e imprimir nuevo valor en la moda. Para almacenar hecho es algo que tiene que declarar una variable de instancia (Ivar) en su clase:
@interface SomeClass : NSObject {
int _someNumber;
}
y hacer descriptores de acceso (el nombre colectivo de captadores y definidores) para almacenar/recuperar su valor:
- (int)someNumber {
return _someNumber;
}
- (void)setSomeNumber:(int)newValue {
_someNumber = newValue;
}
...
SomeClass *anObject = [[SomeClass alloc]init];
anObject.someNumber = 15;
NSLog(@"It's %d", anObject.someNumber); // prints "It's 15"
bien, ahora que la propiedad se comporta igual que la variable de costumbre. ¿Cuál es el sentido de escribir todo ese código?
Primero, a partir de ahora puede agregar un código adicional a los accesadores, que se ejecutará cada vez que se acceda o cambie la propiedad. Hay varias razones para hacerlo, por ejemplo, es posible que desee hacer algún tipo de cálculo oculto o actualizar el estado de mi objeto, cosas de almacenamiento en caché, etc.
En segundo lugar, existen mecanismos interesantes llamados Codificación de valores-clave (KVC) y Key-Value Observation (KVO) en Cocoa. Ellos dependen de las propiedades. Puede leer sobre ellos en la Biblioteca del desarrollador: KVC Programming Guide y KVO Programming Guide. Sin embargo, esos son temas avanzados.
Por último, en Objective C no hay una asignación estática para los objetos. Todos los objetos están dinámicamente asignados (reason). Si desea mantener los punteros de objeto en variables de instancia (en lugar de propiedades), deberá realizar toda la administración de memoria manualmente cada vez que asigne un nuevo valor a su ivar (no verdadero cuando esté activado Automatic Reference Counting). Con las propiedades, puede colocar algún código de administración de memoria en los accesorios y hacer su vida más fácil.
No creo que esta explicación tenga mucho sentido para alguien que no esté familiarizado con la administración de memoria Objective C, así que lea algunos documentos/tutoriales reales o simplemente use propiedades (en lugar de variables de instancia) hasta aprendes todos los detalles de una forma u otra. Personalmente, no me gusta la segunda opción, pero depende de usted.
Puede usar @synthesize
para hacer que el compilador genere acceso básico y variables de instancia subyacentes automáticamente. En lugar de que el código anterior (-(int)someNumber
y -(void)setSomeNumber:
) sólo podría escribir
@synthesize someNumber = _someNumber; // = _someNumbers tells compiler
// to name the instance variable `_someNumber`.
// You could replace it with = `_somethingElse`, of
// course, but that's an ill idea.
Esta sola línea genera int _someNumber
variables, someNumber
getter y setter setSomeNumber
para usted. Si desea que los descriptores de acceso hagan algo más complejo que solo almacenar/recuperar el valor de alguna variable de instancia, tendrá que escribirlos usted mismo.
Espero que todo esto tenga sentido.