Dire che ho il seguente:L'assegnazione di proprietà Objective-C restituisce il valore assegnato?
@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
Poi:
MyClass* mcInst = [[[MyClass alloc] init] autorelease];
NSLog(@"I set 'foobar' to '%@'", (mcInst.foobar = @"BAZ!"));
Guardando il valore di ritorno di -[MyClass setFoobar:]
, si potrebbe supporre qui che questa linea sarebbe stampare I set 'foobar' to ''
, perché l'assegnazione sembra di tornare nulla .
Tuttavia - per fortuna - questa assegnazione agisce come previsto, e le stampe di codice I set 'foobar' to 'BAZ!'
. Sfortunatamente, questo sembra una contraddizione, perché il valore di ritorno del setter invocato smentisce il fatto che l'assegnazione restituisce il valore assegnato ad esso. Inizialmente ho pensato che lo mcInst.foobar = @"BAZ!";
stia effettuando due chiamate anziché un blocco: prima il setter e poi il getter per raccogliere il valore di ritorno. Tuttavia, strumentare i metodi setter e getter con le chiamate NSLog
dimostra che questo non è il caso.
Penso piuttosto che "Perché funziona NSLog?", Una domanda migliore (e penso che la domanda che stai ponendo) sia "perché il setter restituisce nulla, e non (in questo caso) NSString *? avevo supposto che mcInst.foobar = fosse solo zucchero sintattico per [mcInst setFoobar: ...] Suppongo di no ... –
Sì, la domanda è: perché il compilatore genera un errore quando si usa 'NSLog (@" I set ' foobar 'a'% @ '", [mcInst setFoobar: @" BAZ! "]);' riconoscendo che il metodo non restituisce nulla, ma ti permette di farlo nell'altro modo. – Dimitris
Brian: sì, quello era in effetti la domanda che stavo cercando di porre, anche se la mia formulazione potrebbe aver nascosto che =) – rpj