@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
.
¿Y cuál es tu pregunta? –