ultima tutorial objective logo espaƱol objective-c

objective-c - tutorial - objective c vs c++



Propiedad vs variable de instancia (1)

Posible duplicado:
¿Hay una diferencia entre una "variable de instancia" y una "propiedad" en object-c / cocoa / cocoa-touch?

¿Cuál es un caso en el Objetivo C en el que desearía usar una variable de instancia vs propiedad? ¿Puede alguien proporcionar un ejemplo de la vida real?


Una variable de instancia es única para una clase. Por defecto, solo la clase y las subclases pueden acceder a ella. Por lo tanto, como principio fundamental de la programación orientada a objetos, las variables de instancia (ivars) son privadas: están encapsuladas por la clase.

Por el contrario, una propiedad es un valor público que puede o no corresponder a una variable de instancia. Si quieres hacer público un ivar, probablemente harías una propiedad correspondiente. Pero al mismo tiempo, las variables de instancia que desea mantener privadas no tienen propiedades correspondientes, por lo que no se puede acceder a ellas desde fuera de la clase. También puede tener una propiedad calculada que no corresponde a un ivar.

Sin una propiedad, los ivars pueden mantenerse ocultos. De hecho, a menos que se declare un ivar en un encabezado público, es difícil incluso determinar que tal ivar existe.

Una simple analogía sería un libro envuelto en plástico. Una propiedad puede ser el title , el author o la tapa dura frente a la tapa blanda. Los "ivars" serían los contenidos reales del libro. No tiene acceso al texto real hasta que sea dueño del libro; no tiene acceso a los ivars a menos que sea el propietario de la clase.

Más interesante aún, las propiedades están mejor integradas en el tiempo de ejecución. Los tiempos de ejecución modernos de 64 bits generarán un ivar para las propiedades de acceso, por lo que ni siquiera necesita crear el ivar. Las propiedades son de hecho métodos:

// This is not syntactically correct but gets the meaning across (self.variable) == ([self variable];) (self.variable = 5;) == ([self setVariable:5];)

Para cada propiedad, hay dos métodos (a menos que la propiedad se declare de readonly , en cuyo caso solo hay uno): existe el getter , que devuelve el mismo tipo que ivar y tiene el mismo nombre que ivar, también como el setter (que no se declara con un ivar de readonly ); devuelve void y su nombre se establece simplemente ante el nombre de la variable.

Como son métodos, puedes hacer llamadas dinámicas en ellos. Usando NSSelectorFromString() y los diversos métodos performSelector: puede hacer un programa muy dinámico con muchas posibilidades.

Finalmente, las propiedades se utilizan ampliamente en Core Data y en Key-Value Coding . Core Data es un marco avanzado para almacenar datos en una base de datos SQLite a la vez que proporciona una interfaz clara de Obj-C; KVC se usa a lo largo de Core Data y es una forma dinámica de acceder a las propiedades. Se utiliza cuando se codifican / decodifican objetos, como cuando se lee desde XIB.