当前位置:  开发笔记 > IOS > 正文

调用self.myInstanceVariable和直接调用myInstanceVariable有什么区别?

如何解决《调用self.myInstanceVariable和直接调用myInstanceVariable有什么区别?》经验,为你挑选了1个好方法。

这是一个月前我正在读一条关于那条线的.我不确定,但我认为如果我调用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(是的,我也试过了).

只是觉得有人会对一个小案例研究感兴趣;)



1> Jab..:

那是正确的.如果您直接使用该变量,绕过getter/setter可能会产生错误.吸气剂/设定器可以负责保留和/或释放物体以及其他物体.这可能导致崩溃/内存泄漏等.

如果您知道自己绕过了getter/setter并采取了正确的预防措施,那么直接访问变量没有任何问题.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有