2009-07-08 15 views
8

Cuál es la diferencia entre una propiedad y una variable de instancia en Objective-C. Necesito entender esto en términos de OOP. ¿Es una declaración de propiedad simplemente un contenedor de conveniencia (con @synthesize en la implementación) para acceder a variables de instancia?Propiedades de Objective-C en desarrollo de iPhone

gracias,

codecowboy.

Respuesta

7

Propiedades e Ivars son dos cosas completamente diferentes.

Y la variable de instancia es una variable almacenada dentro del objeto, por lo que cada instancia tiene la suya propia. Se hace referencia mediante la adición del puntero en relación con el puntero/auto del objeto (ligeramente indirecto para el tiempo de ejecución moderno, pero funcionalmente equivalente). Los ivars son generalmente internos de una clase y, de forma predeterminada, solo pueden accederse por la clase y sus descendientes (@protected). Dentro de los métodos están disponibles sin calificación, de lo contrario se puede acceder (pero rara vez, ad usuaually no) a través de indirección, por ejemplo obj-> ivar.

Una propiedad define una interfaz getter y setter (el setter es opcional). Eso es todo lo que hace. Define dos métodos públicos:

- (TYPE) propname; 
- (void) setPropname: (TYPE) newPropname; 

Se definen como métodos exactamente como si los hubiera declarado así, ni más ni menos. Estos métodos se llaman con la sintaxis normal ([obj propname] y [obj setPropname: n] o con la notación moderna de puntos (obj.propname u obj.propname = n). Estas dos opciones son solo sintácticamente diferentes, se comportan de forma idéntica , y puede usar la notación con punto si los métodos se declaran con @property o se declaran manualmente como se indicó anteriormente.

Debe implementar los métodos en la implementación, escribiendo los métodos usted mismo, usando @synthesize, o manipulando el método que falta dinámicamente.

Las propiedades pueden estar respaldadas por un ivar (llamado igual o nombrado de manera diferente (mi preferencia para evitar confusiones)), o pueden no. Pueden almacenar su valor en otro lugar, o pueden calcularlo desde otros datos.

Por ejemplo, es posible que tenga:

@property (nonatomic, readonly) NSString* fullname; 

y luego poner en práctica - (NSString *) nombre completo para devolver la concatenación de nombre y apellido.

+0

Aquí es exactamente donde está mi confusión. ¿Una instancia de objeto tampoco posee sus propias propiedades? Mi comprensión de los objetos en términos generales es que contienen información sobre el estado (datos) y el comportamiento (métodos). ¿Por qué necesito variables de instancia Y propiedades? ¿Las variables de instancia son inmutables a menos que las declare como propiedades? – codecowboy

+2

Una propiedad es una interfaz para objetos externos para obtener y establecer datos. Una variable de instancia es interna para ese objeto, aunque puede exponerse a objetos externos utilizando propiedades, sus propios métodos getter/setter o indirectamente a través de otros métodos públicos que cree. –

+1

En otras palabras, la declaración de propiedad no crea algo en el objeto instancia. Simplemente le dice al mundo exterior cómo obtener algo del objeto. Ese algo podría ser una variable de instancia, o si podría ser cualquier información para la que quieras escribir el método getter y setter. En cuanto a las variables de instancia, se puede acceder de la misma manera que se puede hacer en C y C++. – Vagrant

4

Creo que estás más o menos allí. @property y @synthesize hacen las declaraciones de acceso e implementación para el ivar ya declarado. Usted tiene varios atributos que se pueden definir en el @property también que le permite controlar la forma en que se genera para que sea apropiado para el Ivar

echar un vistazo a "Objective C 2.0 Declared Properties"

0

La diferencia entre Propiedad y Instancia Ivar es, la variable que hacen que Propiedad que puede ser visible en otra clase, mientras que para el acceso a la Ivar o instancia que necesita para crear el Objeto de esa clase y luego puedes acceder. y Con el uso de @synthesize compilador generará el colocador y getter para esa propiedad.

- (TIPO) nombre; -getter Método

- (void) setName: (TIPO) unNombre; Método setter

Cuestiones relacionadas