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