2012-01-30 12 views
7

En Obj-c cuando se declara una variable dentro de @interfaceinterfaz objetivo-c - declarando variable vs just property?

@interface: NSObject { MyObject * myObject}

@property (inseguro, no atómica) MyObject * myObject;

vs. Sólo declararemos como una propiedad

@interface: NSObject {}

@property (no seguro, no atómica) MiObjeto * myObject; @end

No declarar ninguna var aquí?

Saludos Cristiano

+3

¿Y cuál es tu pregunta? –

Respuesta

10

@property define una interfaz, no una implementación. En su caso, está definiendo una propiedad de lectura. Esto significa que promete implementar -myObject y -setMyObject:. Esto no tiene nada que ver con ivars.

Ahora, la forma más común de implementar esos métodos es haciéndolos respaldados por un ivar. Para su comodidad, ObjC le permite generar automáticamente los métodos necesarios con una tienda ivar usando @synthesize myObject=myObject_; Esto dice "crear los métodos necesarios para la propiedad myObject usando un ivar llamado creado automáticamente myObject_". El ivar myObject_ es un ivar real, y puede acceder a él normalmente (aunque generalmente no debería hacerlo, debe usar accesadores).

En lugar de usar @synthesize, puede implementar -myObject y -setMyObject:. Incluso podría usar @dynamic myObject; para decirle al compilador "no se preocupe por las implementaciones de esta propiedad, se manejarán correctamente en el tiempo de ejecución".

Hay algunas diferencias entre @property y métodos simplemente declaran, pero, en principio, esta línea:

@property (nonatomic, readwrite, strong) MyObject* myObject; 

es conceptualmente lo mismo que esto:

- (MyObject *)myObject; 
- (void)setMyObject:(MyObject *)anObject; 

anuncio lo Ivar sí mismo no tiene impacto real aquí. Aún necesita implementar los métodos de alguna manera. Si su ivar es el mismo que el ivar @synthesize está usando, entonces @synthesize simplemente no creará un nuevo ivar.

Como cuestión de práctica, desanimo a la gente de declarar ivars nunca más. Recomiendo simplemente usar propiedades públicas y privadas con @synthesize para crear los ivars necesarios. Si debe tener un ivar manual por algún motivo, le recomiendo que los declare en el bloque @implementation en lugar del @interface.

9

Saltarse declarando la Ivar está perfectamente bien - pero no será capaz de ver el valor de la Ivar en el IDE de Xcode. Un día Apple puede arreglar esto.

Podrá "po" el ivar para inspeccionarlo en GDB o lldb.

+0

+1 para eso - He estado jurando mucho sobre el depurador últimamente, ¡no se me había ocurrido que al declarar el ivar haría que mis cosas fueran visibles para el depurador! –

+0

Por favor, presente un informe de error con Apple: bugreport.apple.com – zaph