2012-05-03 18 views

Respuesta

71

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.

3

La propiedad "getters" y "setters" en la mayoría de los lenguajes orientados a objetos proporcionan una interfaz "externa" o de usuario alrededor de los miembros privados de las instancias de sus clases. Algunos críticos de OO se referirán a ellos como "azúcar sintáctico", pero lo que se reduce a esto es que los consumidores de sus clases utilizarán estas interfaces que controlan programáticamente en lugar de tener acceso al miembro real de los mismos. De esta forma, puede (por ejemplo) proteger una variable privada para que no reciba un valor no válido o fuera de rango, o hacer que una propiedad sea de solo lectura proporcionando solo un getter pero no un setter. Aún más interesante es la idea de que los getters y los setters puedan envolver propiedades que no se retienen de forma nativa en su clase, pero que podrían (por ejemplo) calcularse en base a otros miembros de la instancia.

Los getters y setters seguramente no son exclusivos de Objective-C; Si continúa programando en otros lenguajes OO, encontrará sabores de ellos en C#, Java y otros.

Buena suerte.

4

"Getters" y "setters" se utilizan para controlar los cambios en una variable (campo).

Un "setter", se utiliza con mayor frecuencia en la programación orientada a objetos, de acuerdo con el principio de encapsulación. De acuerdo con este principio, las variables miembro de una clase se hacen privadas para ocultarlas y protegerlas de otros códigos, y solo pueden ser modificadas por una función miembro pública, que toma el nuevo valor deseado como parámetro, opcionalmente lo valida, y modifica el variable de miembro privado.

A menudo un "setter" va acompañado de un "getter" (también conocido como un descriptor de acceso), que devuelve el valor de la variable de miembro privada.

Los métodos Getter/Setter también se pueden usar en entornos no orientados a objetos. En este caso, una referencia a la variable que se va a modificar se pasa al método, junto con el nuevo valor. En este escenario, el compilador no puede restringir que el código pase por alto los métodos getter/setter y cambie la variable directamente. La responsabilidad recae en los desarrolladores para garantizar que la variable solo se modifique a través de estos métodos y no se modifique directamente.

En los lenguajes de programación que los admiten, las propiedades ofrecen una alternativa conveniente sin renunciar a la utilidad de la encapsulación.