self.foo=nil 和 [self setFoo:nil] 有啥区别?

Posted

技术标签:

【中文标题】self.foo=nil 和 [self setFoo:nil] 有啥区别?【英文标题】: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会改变它?

谢谢。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于self.foo=nil 和 [self setFoo:nil] 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

ObjC 属性和 C 运算符

使类在同一实例中可调用

Python - 私有属性(双下线的变形)

何时使用 [self.obj message] vs [obj message] [重复]

self :: vs class Name :: inside static class PHP中的名称方法

Python、Pycharm 从动态变量中获取代码补全