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.
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
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. –
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