一个月前,我正在读一篇关于此的文章。我不确定,但我认为如果我调用 self.myInstanceVariable 那么它会自动使用 getter/setter,但是如果我直接调用 myInstanceVariable = @"Foo" 例如,那么我会绕过任何真正的 getter/setter ,真的,非常糟糕。正确错误?
编辑:我在 XCode 中试过这个。
实现如下所示:
@implementation Test
@synthesize name;
+ (Test*)testWithName:(NSString*)name {
Test* test = [self alloc];
test.name = name;
return [test autorelease];
}
- (void)setName:(NSString*)newName {
NSLog(@"SETTER CALLED!!");
if(name != newName) {
[name release];
name = [newName retain];
}
}
- (NSString*)name {
NSLog(@"GETTER CALLED!!");
return name;
}
- (void)doWrongThing {
NSString *x = name;
NSLog(@"doWrongThing: %@", x);
}
- (void)doRightThing {
NSString *x = self.name;
NSLog(@"doRightThing: %@", x);
}
测试代码如下所示:
Test *t = [Test testWithName:@"Swanzus Longus"];
//NSLog(@"%@", t.name);
[t doWrongThing];
[t doWrongThing];
[t doWrongThing];
[t doRightThing];
因此,在以另一种方法启动此代码后(我只是使用了现有项目;)),我在控制台中收到了以下输出:
2009-05-01 19:00:13.435 Demo[5909:20b] SETTER CALLED!!
2009-05-01 20:19:37.948 Demo[6167:20b] doWrongThing: Swanzus Longus
2009-05-01 20:19:37.949 Demo[6167:20b] doWrongThing: Swanzus Longus
2009-05-01 20:19:37.949 Demo[6167:20b] doWrongThing: Swanzus Longus
2009-05-01 20:19:37.950 Demo[6167:20b] GETTER CALLED!!
2009-05-01 20:19:37.965 Demo[6167:20b] doRightThing: Swanzus Longus
如您所见,您必须使用 self.instanceVariableName 才能使用 getter 和 setter(或者您在括号中进行调用,也可以)。
混淆警报:只有在您想要访问实例变量的对象的方法中进行修改时,您才必须使用 self 。从外部看,当您调用 someObjectPointer.someInstanceVariable 时,它会自动访问 getter 和 setter(是的,我也尝试过)。
只是以为有人会对一个小案例研究感兴趣;)