Скажем, у меня есть следующие:Назначение объекта Objective-C возвращает присвоенное значение?
@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
Тогда:
MyClass* mcInst = [[[MyClass alloc] init] autorelease];
NSLog(@"I set 'foobar' to '%@'", (mcInst.foobar = @"BAZ!"));
Глядя на возвращаемое значение -[MyClass setFoobar:]
, можно было бы предположить здесь, что эта линия будет печатать I set 'foobar' to ''
, поскольку присваивание, кажется, не вернуть ничего ,
Однако - к счастью - это назначение действует так, как ожидалось, и код печатает I set 'foobar' to 'BAZ!'
. К сожалению, это похоже на противоречие, поскольку возвращаемое значение вызываемого сеттера противоречит факту, что присваивание возвращает назначенное ему значение. Сначала я понял, что mcInst.foobar = @"BAZ!";
делает два вызова вместо блока: сначала сеттер, а затем геттер, чтобы собрать возвращаемое значение. Однако использование инструментов setter и getter с помощью NSLog
звонков доказывает, что это не так.
Я думаю, а не «Почему NSLog работает?», Лучший вопрос (и я думаю, что вы задаете вопрос): «Почему сеттер возвращается в пустоту, а не (в данном случае) NSString *? предположил, что mcInst.foobar = был просто синтаксическим сахаром для [mcInst setFoobar: ...] Я думаю, не ... –
Да, вопрос в том, почему компилятор выдает ошибку, когда вы используете 'NSLog (@" I set ' foobar 'to'% @ '", [mcInst setFoobar: @" BAZ! "]),' признавая, что метод ничего не возвращает, но позволяет сделать это другим способом. – Dimitris
Брайан: да, это было на самом деле вопрос, который я пытался задать, хотя моя формулировка, возможно, скрыла это =) – rpj