使用指针设置属性而不是发送对象消息

时间:2013-07-21 23:16:03

标签: ios objective-c pointers

以下是一个示例场景:

您有一个视图控制器“ItemsViewController”,它在UITableView中列出“Items”。这都是在导航控制器中设置的,可以让您更改UINavigationItem标题属性的标题。我正在阅读一本仍然无名的书,它在同一页面上以两种方式访问​​这个属性,我不知道为什么;

使用指针

UINavigationItem *n = [self navigationItem]; [n setTitle: @"Title"];

直接发送对象消息

[[self navigationItem] setTitle:[item itemName]];

我理解这两个工作如何工作(如果我错了,请纠正我)指针指向navigationItem,当你更改属性时,它会在navigationItem中更改它

否则你向navigationItem发送带有更新字符串的setTitle消息。

然而,我真正的问题是,为什么你会在任何情况下以相反的方式做到这一点?是否有时候其中一种方式有优势?

3 个答案:

答案 0 :(得分:3)

最终结果是一样的。另一种选择是:

self.navigationItem.title = item.itemName;

使用中间变量的好处是可读性和调试性。很多时候人们使用5级嵌套方法调用来发布代码,然后问为什么它不起作用。通过使用中间变量将这些调用拆分为单独的行,您可以更轻松地读取和调试代码。但是对于这个例子,没什么好处。

深入挖掘某些集合层次结构时,这非常有用。

答案 1 :(得分:1)

他们真的相同。唯一的区别是,在第一种情况下,您持有对象的命名本地引用,而在第二种情况下,您没有。

在2个表单之间进行选择是部分个人偏好,以及您要在对象上调用的方法数量。如果您只是要调用一个方法,那么命名局部变量的唯一真正好处是它可以使调试更容易。

答案 2 :(得分:0)

当您执行第二步时,编译器会生成一个隐藏的临时变量。在第一种情况下,您为编译器定义临时变量。

通常最好将“菊花链”操作分解为连续的临时分配(请在单独的行上!),以使序列更清晰,并使调试更容易。

当操作分开(并且在单独的行上!)时,设置断点,检查中间结果等变得容易。并且在性能方面没有“缺点”。

(在同一行上放置多个语句很少是合理的,这样做有很多理由。)