【问题标题】:What's the difference between self.foo=nil and [self setFoo:nil]?self.foo=nil 和 [self setFoo:nil] 有什么区别?
【发布时间】:2012-03-01 06:40:37
【问题描述】:

在xcode中,你创建了一个UIViewController子类后,在viewDidUnload方法中,有一个xcode添加的注释:

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

这里xcode推荐我们使用self.myOutlet=nil来释放对象。

但是在xcode4中,有一个很酷的特性:你可以将一个Interface Builder的outlet拖到它的所有者的头文件中,然后xcode会在viewDidUnload方法中自动创建IBOutlet对象和相关的发布代码。

问题是在上面的场景中,它生成的代码是这样的:

- (void)viewDidUnload {
    [super viewDidUnload];
    [self setFoo:nil];
}

我提到“self.foo = nil;”被“[self setFoo:nil];”替换。

有人知道区别吗?如果没有区别,为什么xcode4会改变它?

谢谢。

【问题讨论】:

    标签: iphone objective-c xcode4


    【解决方案1】:

    在可执行文件中,两种语法没有区别。我能想到 Xcode 显式使用 setter 方法的唯一技术原因是为了与不支持点语法的 Objective-C 2.0 之前的代码兼容。我不知道为什么 Xcode 需要支持这种兼容性。可能 Xcode 中生成 set-to-nil 表达式的部分早于 Objective-C 2.0。

    或者也许编写 Xcode 的那部分的人根本不喜欢点语法。点语法刚被引入时,很多人不喜欢它。

    http://weblog.bignerdranch.com/?p=83
    http://www.cimgf.com/2008/07/08/a-case-against-dot-syntax/
    http://cocoawithlove.com/2008/08/in-defense-of-objective-c-20-properties.html

    【讨论】:

    • 感谢您的回复。这个问题导致我的代码风格丑陋。一些代码行使用 self.foo = nil,其他 IDE 生成的代码使用 [self setFoo:nil];如何解决这个问题?
    • 您只需要自己修复它们,手动或编写脚本。
    【解决方案2】:

    这两个调用都会做同样的事情。

    self.foo = nil;
    

    是点语法版本:

    [self setFoo:nil];
    

    没有性能差异,只是您喜欢如何编写代码的偏好问题。

    【讨论】:

      【解决方案3】:

      我认为self.foo 可以是setter/getter,具体取决于使用情况,而[self setFoo] 是对setter 的显式调用。

      在正常使用时,两者应该是一样的。

      关于 Objective C 中点符号的博客条目 http://weblog.bignerdranch.com/?p=83

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多