iphone ios properties ivars

iphone - Diferencia entre @property e ivar en Xcode 4.5



ios properties (2)

Anteriormente, siempre he visto ejemplos de uso de propiedades y iVars como este ...

Dentro de SomeClass.h

@interface SomeClass : NSObject { NSString *_someString; } @property NSString *someString; @end

Luego, en SomeClass.m

#import "SomeClass.h" @implementation SomeClass @synthesize someString = _someString; @end

Más recientemente (en los videos de WWDC 2012) escuché que ya no necesitamos @synthesize y se recomienda usar @property sin iVar asociado.

Entonces, lo anterior cambiaría a ...

SomeClass.h

@interface SomeClass : NSObject @property NSString *someString; @end

SomeClass.m

#import "SomeClass.h" @implementation SomeClass @end

Esto solo está usando @property y no ivar. Esto tiene sentido y lo he estado usando.

Sin embargo, también he visto ejemplos de ...

SomeClass.h

@interface SomeClass : NSObject @end

SomeClass.m

#import "SomeClass.h" @interface SomeClass () { NSString *someString; } @end @implementation SomeClass @end

En este solo tienen un iVar privado y no @property .

Entonces, ¿cuál es la diferencia? Entiendo que @property proporciona los métodos de acceso pero no es necesario anular los métodos de acceso. Solo puede usar los accesos predeterminados.

Entonces, ¿cuándo usarías @property y no un ivar y cuándo usarías solo un ivar y no una @property ? ¿Y por qué no deshacerse de ivars por completo y simplemente usar @properties ? Si necesitan ser privados, simplemente utilícelos dentro de la extensión de la interfaz en .m .

Edición rápida en respuesta a una respuesta sobre la administración de la memoria. Estoy usando ARC y, para mí, parece que tengo más control sobre la gestión de la memoria con el uso de @properties strong y weak que con el uso de iVars.

Espero que la pregunta sea lo suficientemente clara.

Gracias


Creo que depende de que tengas acceso a ivars públicos con sintaxis " -> ". Tal vez previamente, si declaras una propiedad de solo lectura sin @private , puedes acceder a ella con la sintaxis " -> ". (tal vez se rompe la encapsulación).

Pero ahora si declaras algo como esto

{ @private NSArray *a; @protected NSArray *b; @public NSArray *c; } @property (nonatomic, retain) NSArray *d;

Puede acceder con " -> " solo a " c " ivar, simplemente pruebe este código. con a, b y d será advertencia o error.

Si de alguna manera ayuda, me alegraré.


En general, siempre puedes usar propiedades. Si tiene la propiedad "asignar", puede usar ivar porque no necesita ninguna gestión de memoria en sus getters / setters. Pero si debe retener los objetos, no es conveniente usar ivars porque debe retenerlos / soltarlos manualmente mientras las propiedades lo hacen por usted.

Además, si usa ivars, no tiene control sobre la configuración / obtención de valores. En general, es una mala práctica usar campos públicos en lugar de getters o setters. Por ejemplo, no está bien si puede establecer un valor negativo para el campo que almacena la edad de la persona.

Y no puedes usar KVO con ivars