说我有以下内容:
@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!'
. 不幸的是,这感觉像是一个矛盾,因为调用的 setter 的返回值掩盖了赋值返回分配给它的值的事实。起初我认为这mcInst.foobar = @"BAZ!";
是进行两次调用而不是一个块:首先是 setter,然后是 getter 以收集返回值。但是,使用调用来检测 setter 和 getter 方法NSLog
证明情况并非如此。