这是一个月前我正在读一条关于那条线的.我不确定,但我认为如果我调用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并采取了正确的预防措施,那么直接访问变量没有任何问题.