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] 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
何时使用 [self.obj message] vs [obj message] [重复]