Decir que tengo el siguiente:La asignación de propiedad Objective-C devuelve el valor asignado?
@interface MyClass : NSObject { NSString* _foobar; }
@property (nonatomic, retain) NSString* foobar;
@end
@implementation MyClass
@dynamic foobar;
- (void) setFoobar:(NSString*)fbSet; { [_foobar release]; _foobar = [fbSet retain]; }
- (NSString*) foobar; { return _foobar; }
@end
continuación:
MyClass* mcInst = [[[MyClass alloc] init] autorelease];
NSLog(@"I set 'foobar' to '%@'", (mcInst.foobar = @"BAZ!"));
Mirando el valor de retorno de -[MyClass setFoobar:]
, se podría suponer aquí que esta línea imprimiría I set 'foobar' to ''
, ya que la asignación parece devolver nada .
Sin embargo, afortunadamente, esta asignación funciona como se esperaba, y el código imprime I set 'foobar' to 'BAZ!'
. Desafortunadamente, esto parece una contradicción, porque el valor de retorno del instalador invocado oculta el hecho de que la asignación devuelve el valor asignado. Al principio pensé que mcInst.foobar = @"BAZ!";
estaba haciendo dos llamadas en lugar de un bloque: primero el colocador y luego el captador para recopilar el valor de retorno. Sin embargo, la instrumentación de los métodos setter y getter con llamadas NSLog
demuestra que este no es el caso.
Creo que en lugar de "¿Por qué funciona NSLog?", Una mejor pregunta (y creo que la pregunta es) es "¿por qué el colocador devuelve vacío, y no (en este caso) NSString *? También había asumido que mcInst.foobar = era solo azúcar sintáctica para [mcInst setFoobar: ...] Supongo que no ... –
Sí, la pregunta es por qué el compilador arroja un error cuando se usa 'NSLog (@" I set ' foobar 'a'% @ ', [mcInst setFoobar: @ "BAZ!"]);' reconociendo que el método no devuelve nada, pero te permite hacerlo de otra manera. – Dimitris
Brian: sí, eso fue de hecho la pregunta que estaba tratando de preguntar, aunque mi redacción puede haber ocultado que =) – rpj