一个月前,我读到了一篇关于此事的文章。我不确定,但我认为如果我调用 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(是的,我也尝试过)。
只是认为有人会对一个小案例研究感兴趣;)
最佳答案
这是正确的。如果直接使用变量,绕过 getter/setter,可能会产生错误。 getter/setter 可能负责保留和/或释放对象以及其他事情。这可能会导致崩溃/内存泄漏等。
如果您意识到自己绕过了 getter/setter 并采取了正确的预防措施,那么直接访问变量就没有问题。
关于iphone - 调用 self.myInstanceVariable 和直接调用 myInstanceVariable 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/812185/