objective-c setter getter

Por favor explique Getter y Setters en Objective C



objective-c (3)

Posible duplicado:
Setters and Getters (Noobie) - iPhone SDK

Soy un principiante aquí. Acabo de comenzar a aprender iOS durante los últimos dos meses y no tengo ningún fondo de programación. (Un poco de Java sin embargo). ¿Alguien puede explicar qué es getter y setter en Objective C? ¿Cuál es el uso de ellos? ¿Por qué usamos @property y @synthesize ?


"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 la 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, lo valida opcionalmente y modifica el Variable de miembro privado.

A menudo, un "establecedor" está acompañado por un "captador" (también conocido como un accesor), que devuelve el valor de la variable miembro privada.

Los métodos Getter / Setter también se pueden utilizar en entornos no orientados a objetos. En este caso, una referencia a la variable a modificar se pasa al método, junto con el nuevo valor. En este escenario, el compilador no puede restringir el código para evitar los métodos getter / setter y cambiar 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.


Getter es un método que se llama cada vez que accede (lee un valor desde) una propiedad (declarada con @property ). Lo que devuelva ese 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 devolver el mismo valor a getter e imprimir un nuevo valor en el configurador. Para almacenar realmente algo, debe declarar una variable de instancia (ivar) en su clase:

@interface SomeClass : NSObject { int _someNumber; }

y haga que los accessors (el nombre colectivo para getters y setters) almacenen / recuperen 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 esa propiedad se comporta como la variable habitual. ¿Qué sentido tiene escribir todo ese código?

En primer lugar, a partir de ahora puede agregar un código adicional a los accesores, que se ejecutarán 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álculos ocultos, o actualizar el estado de mi objeto, almacenar cosas en caché, etc.

En segundo lugar, existen mecanismos geniales llamados Codificación de clave-valor (KVC) y Observación de clave-valor (KVO) en Cocoa. Dependen de las propiedades. Puede leer sobre ellos en la Biblioteca de desarrolladores: Guía de programación KVC y Guía de programación KVO . Esos son temas avanzados sin embargo.

Por último, en Objective C no hay una asignación estática para los objetos. Todos los objetos se asignan dinámicamente ( reason ). Si desea mantener sus punteros de objeto en variables de instancia (en lugar de propiedades), tendrá que hacer toda la gestión de la memoria manualmente cada vez que asigne un nuevo valor a su ivar (no es cierto cuando el conteo automático de referencias está activado). Al usar las propiedades, puede colocar un código de administración de memoria en los accesores 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 del Objective C, por lo tanto, lea algunos documentos / tutoriales reales en él o simplemente use propiedades (en lugar de variables de instancia) hasta que aprenda todo detalles de una manera u otra. Personalmente, no me gusta la segunda opción, pero depende de usted.

Puede usar @synthesize para hacer que el compilador genere @synthesize básicos y variables de instancia subyacentes para usted automáticamente. En lugar del código anterior ( -(int)someNumber y -(void)setSomeNumber: simplemente 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 línea única genera la variable int _someNumber , someNumber getter de número y setSomeNumber setter para usted. Si desea que los usuarios accedan a hacer algo más complejo que simplemente almacenar / recuperar el valor de alguna variable de instancia, tendrá que escribirlos usted mismo.

Espero que todo esto tenga sentido.


Los "captadores" y "definidores" de propiedades en la mayoría de los lenguajes orientados a objetos proporcionan una interfaz de usuario o "externa" alrededor de miembros privados de instancias de sus clases. Algunos críticos de OO se referirán a ellos como "azúcar sintáctica", pero lo que se reduce a esto es que los consumidores de sus clases usarán estas interfaces que usted controla mediante programación en lugar de acceder al propio miembro (s) privado (s). De esta manera, puede (por ejemplo) proteger una variable privada de recibir un valor no válido o fuera de rango, o hacer que una propiedad sea de solo lectura al proporcionar solo un captador pero no un definidor. Aún más interesante es la idea de que los captadores y los definidores pueden envolver las propiedades que no se conservan de forma nativa en su clase, pero que podrían (por ejemplo) calcularse basándose en otros miembros de la instancia.

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.