这两行代码有什么区别:
[cmController currentPageNo];
self.cmController.currentPageNo;
答案 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中的新点符号。