tutorial español objective-c properties retain self

objective c - español - Cuándo acceder a las propiedades con ''self''



solidity español (3)

He leído una serie de preguntas en este sitio sobre este tema, entiendo lo siguiente:

self.property accede al método getter / setter creado manualmente o por @synthesize. Dependiendo de si la propiedad se declara como retención, copia, etc. el conteo retenido se modifica correctamente, por ejemplo, una propiedad retenida, libera el valor anterior asignado al nuevo valor con ''retener'' e incrementa el conteo retenido en 1.

Las propiedades generalmente se declaran con variables de instancia del mismo nombre (pueden ser diferentes si realiza la asignación manualmente). En general, esto se debe a que los descriptores de acceso @synthesize utilizan la variable de instancia para hacer referencia al objeto en la memoria y luego realizan los comandos pertinentes.

Mi pregunta se basa en el hecho de que en muchos ejemplos, propiedad propia y propiedad se usan indistintamente para diferentes cosas y tengo problemas para determinar las reglas. Un ejemplo en la aplicación de ejemplo "Recetas" en Apple Docs, tiene lo siguiente:

self.navigationItem.title = recipe.name; nameTextField.text = recipe.name; overviewTextField.text = recipe.overview; prepTimeTextField.text = recipe.prepTime;

y...

self.ingredients = sortedIngredients;

Cada una de estas propiedades tiene variables de instancia privadas asociadas con el mismo nombre. Todos se declaran de la misma manera con los atributos ''no atómicos, retener''. Cada uno se libera en dealloc ...

Sin embargo, se accede a ''ingredientes'' a través de uno mismo y se accede directamente a ''prepTimeTextField''.

¿Cuál es el motivo de la diferencia en los métodos de acceso?

¿Qué pasa si estoy accediendo a un delegado de vista? ¿O un objeto de datos centrales que fue pasado a un controlador de vista por su controlador de vista anterior como una propiedad retenida?

Muchas gracias


Depende Si las variables de su instancia son tontas, está bien acceder a ellas directamente. Pero la razón por la que a la mayoría de nosotros nos gusta acceder a los miembros a través de propiedades es porque podemos cambiar algo sobre la lógica de ese miembro, y las cosas seguirán funcionando.

Por ejemplo, a veces querrás cambiar una clase para cargar algo de forma perezosa, en lugar de inmediatamente. Si ya está usando propiedades para acceder a su variable de instancia, entonces puede simplemente editar el método de acceso y todo debería funcionar.


casi siempre desea acceder a las variables utilizando los setters / getters sintetizados, incluso si no está haciendo algo especial con ellos en este momento.

si a medida que se desarrolla su aplicación, encuentra que necesita realizar más validación / formateo de variables, luego puede implementar el método setter / getter requerido, y si ha utilizado los métodos sintetizados, se llamará a este código.

esto es generalmente un buen hábito para entrar.


Si declaras tu propiedad así:

@property (nonatomic, retain) NSMutableArray *myArray;

El setter generado retendrá automáticamente el valor que se transfiere. Es por eso que verá esto a veces en el código de ejemplo de Apple:

self.myArray= [[NSMutableArray alloc] init]: [self.myArray release];

"[self.myArray release]" es obligatorio porque el conteo de retención es dos después de la primera línea. Liberarlo asegura que está en 1 (donde debería estar).

Si solo estoy usando los setters generados automáticamente, no los usaré cuando trabaje desde dentro de la clase. Es mucho más simple para mí hacer:

myArray = [[NSMutableArray alloc] init];

contra el ejemplo de arriba.

Mis dos centavos.