2012-03-01 58 views
0

在Xcode,你创建一个UIViewController子类后,在viewDidUnload方法,是Xcode中添加评论:self.foo = nil和[self setFoo:nil]有什么区别?

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

这里,Xcode的建议我们使用self.myOutlet =零释放的对象。

但是在xcode4中,有一个很酷的功能:只需将Interface Builder插口拖到它的所有者的头文件,然后xcode就会自动在viewDidUnload方法中创建IBOutlet对象和相关的发布代码。

的问题是在上述情况下,它产生的代码是这样的:

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

予提及的是,“self.foo =零;”由“[self setFoo:nil];”替换。

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

谢谢。

回答

2

在可执行文件中,两种语法没有区别。我能想到Xcode明确使用setter方法的唯一技术原因是为了与不支持点语法的Objective-C 2.0代码兼容。我不知道为什么Xcode需要支持这种兼容性;也许生成set-to-nil表达式的Xcode部分比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

+0

感谢您的答复。该问题导致我的代码风格丑陋。一些代码行使用self.foo = nil,其他IDE生成的代码使用[self setFoo:nil];如何解决这个问题呢? – tangqiaoboy 2012-03-02 09:32:10

+0

您只需手动或通过编写脚本自行修复它们。 – 2012-03-02 18:14:31

2

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

self.foo = nil; 

是点语法版本:你喜欢怎么写代码

[self setFoo:nil]; 

没有性能上的差异,仅仅是偏好的问题。

0

我认为self.foo可以是setter/getter取决于使用,而[self setFoo]是明确调用setter

在正常使用时,两者应该是相同的。在Objective C对点符号

博客文章 http://weblog.bignerdranch.com/?p=83