2011-09-21 17 views
8

Por lo que yo entiendo, @property declara getter y setter en el archivo .h y @synthesize implementa el getter y el setter en los archivos .m. Además, es posible escribir su propia implementación para getter y setter en lugar de usar @synthesize.Objective-C: @property declaration without implementation (@synthesize)

Entonces, si siempre necesitamos implementar setter/getter, ¿por qué necesitamos declararlo adicionalmente? @property parece ser redundante para mí y una fuente de errores.

¿Qué sucede cuando declaro @property pero olvido implementarlo con @synthesize o manualmente? ¿Qué sucede cuando uso @synthesize y olvido la declaración @property?

Respuesta

26

Las propiedades ahora están sintetizadas por defecto, ya que Xcode 4.4, entonces sí, tienes razón, era redundante y Apple eliminó la necesidad de escribir @property y @synthesize, simplemente usa @property a partir de ahora.

+0

bueno que agregaron esto. Gracias por la respuesta –

+8

Todavía hay un caso en el que tendrá que usar ambas propiedades y sintetizar juntas. El compilador usará el nombre de la propiedad más el prefijo de subrayado para crear el ivar. Si el ivar _propertyname colisiona con una variable de instancia privada, tendrá que sintetizarlo en un nuevo ivar. Por ejemplo: si está subclasificando la UIToolbar y declara una propiedad que la nombra delegada, obtendrá un error al intentar usar el comando ivar _delegate porque la UIToolbar contiene una variable de instancia privada id _delegate. Puede resolver esto usando '@synthesize delegate = _mydelegate;'. – lolol

4

¿Qué sucede cuando declaro @property pero olvido implementarlo con @synthesize o manualmente? ¿Qué sucede cuando utilizo @synthesize y olvidé la declaración @property?

¿Por qué no lo intentas? Si olvida sintetizar los accesadores o proporciona los suyos propios, el compilador le avisará. (Y si lo tiene configurado para tratar las advertencias como errores, lo cual es una buena idea, es imposible omitir la advertencia). El segundo caso generalmente generará un error de compilación.

Entonces, si siempre necesitamos implementar setter/getter, ¿por qué necesitamos y declararlo? @property parece ser semántica redundante para y una fuente de errores.

En pocas palabras, @property es una declaración de propiedad y @synthesize es una posible implementación. Uno pertenece al encabezado (= descripción de la interfaz pública) y el otro al archivo de implementación. ¿Cómo lo harías si no fuera así?

6

tener continuación en el archivo .h

@property (retain, nonatomic) NSString* userName; 

es el azúcar sintáctica para

-(NSString*)userName; 

-(void)setUserName:(NSString*)userName; 

en el archivo .h

y @synthesize en .m es el azúcar sintáctica para salir por su propia implementación respetando su retain, nonatomic, etc. como se especifica en su declaración de propiedad.

no se puede sintetizar con out @property, incluso si se especifica getter apropiado, firma setter en archivo .h.

Pero puede dejar @synthesize e implementar su propio getter y setter.

Si usó @synthesize y también su setter getter personalizado, el tiempo de ejecución respeta su implementación y llama al mismo.

+0

nice explanation – onmyway133

2

Solo quería agregar que también puede usar @dynamic en lugar de @synthesize, aunque esto muy raramente es algo que tendrá que hacer. @dynamic básicamente le está diciendo al compilador que usted es de alguna manera asegurándose de que las llamadas a los getters y setters sean atendidas en el tiempo de ejecución, ya sea haciéndolas usted mismo o haciendo un poco de diversión con algunas de las características especiales del tiempo de ejecución de Objective C.

+0

Me interesa ese "de alguna manera". Quise respaldar algunas propiedades de estilo de punto con un diccionario y fallé por completo. Probablemente fruta para una pregunta. –