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

标签 iphone objective-c cocoa-touch uikit

一个月前,我读到了一篇关于此事的文章。我不确定,但我认为如果我调用 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/

相关文章:

iphone - 修改SpeakHere以录制设备上播放的音频

iphone - 如何从 iPhone 应用程序访问和打开 iPhone 的 SMS API

objective-c - performSelectorOnMainThread : and dispatch_async() on main queue? 有什么区别

ios - 如何将 UIImagePicker 与带有按钮和 UIImageView 的自定义单元格一起使用?

ios - 滑动删除将 UITableViewCell 移至左侧

ios - SKMaps - 上传到 iTunes Connect 的应用程序错误 - 无效二进制 - 段对齐 - 加密

iOS 8.0 UIWebView 文件输入崩溃我的应用程序

ios - 将应用从付费转换为应用内购买?我如何找出哪些用户支付了费用?

ios - 在 iOS 7 的 UINavigationController 上推送 View 时如何交叉融合?

cocoa-touch - 分组的 UITableView 边缘出现奇怪的黑角