iPhone - 这两行代码之间的区别

时间:2010-12-04 08:12:25

标签: iphone objective-c iphone-sdk-3.0

这两行代码有什么区别:

[cmController currentPageNo];
self.cmController.currentPageNo;

3 个答案:

答案 0 :(得分:5)

实际上存在功能差异 - 第二行相当于:

[[self cmController] currentPageNo];

使用-cmController属性getter方法访问cmController ivar可能会产生与直接访问ivar不同的行为。这些可能包括延迟初始化或原子线程锁定,或一系列其他行为。除非你有充分的理由,否则你应该(通常)使用属性的访问器方法,而不是直接访问ivars。

所以澄清一下:

[cmController currentPageNo]; // 1
cmController.currentPageNo;   // 2

[[self cmController] currentPageNo]; // 3
self.cmController.currentPageNo;     // 4

1和2在功能上彼此相同,但使用不同的语法。 3和4在功能上也彼此相同,但使用不同的语法。如果您厌恶使用dot-syntax,则应使用版本4或版本3.

答案 1 :(得分:3)

通常,点符号只是语法糖。

但在这种情况下,确实存在一些差异。

[cmController currentPageNo];

这将直接使用类的实例变量来获取cmController。然后它会将currentPageNo发送给它。

self.cmController.currentPageNo;

另一方面,这将使用当前类的属性定义通过类的ivar获取cmController。

这意味着,基本上,第一个比第二个更有效。不是因为你使用了点符号,而是因为你直接使用了cmController而不是self.cmController[whatever currentPageNo]whatever.currentPageNo相同。

除了使用的语法之外,这些行是等效的:

[cmController currentPageNo];
cmController.currentPageNo;

另一方面,除了使用的语法之外,这些行是等效的:

self.cmController.currentPageNo;
[[self cmController] currentPageNo];

我希望这很清楚。

您可以阅读点符号here

答案 2 :(得分:0)

功能上没有区别; Objective C 2.0刚刚引入了点符号,给那些不是括号的人提供了一条出路。

编辑:

正如评论所指出的,当然这是错误的。我回答了(未提出的)“[cmController currentPageNo];self.cmController.currentPageNo;之间有什么区别?”的问题。

Nick's answer给出了真正的答案,即第一行直接访问变量,而第二行使用变量的getter方法。这两行也有所不同,第一行使用典型的括号表示法,而第二行确实使用了目标C 2.0中的新点符号。