1

这是一个示例场景:

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

使用指针

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

直接发送对象消息

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

我了解这两种方法的工作原理(如果我错了,请纠正我)指针指向 navigationItem 并且当您更改属性时,它会在 navigationItem 中更改它

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

然而,我真正的问题是,为什么在任何情况下你都会以一种方式而不是另一种方式来做这件事?这些方法中的一种是否有优势?

4

3 回答 3

3

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

self.navigationItem.title = item.itemName;

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

在深入挖掘某些集合层次结构时,它真的很有帮助。

于 2013-07-21T23:22:07.540 回答
1

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

在这两种形式之间进行选择部分是个人喜好,部分是您将在对象上调用多少方法。如果您只是要调用一种方法,那么命名局部变量的唯一真正好处是它使调试更容易。

于 2013-07-21T23:21:59.413 回答
0

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

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

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

(很少有理由将多个语句放在同一行,并且有很多理由这样做。)

于 2013-07-22T00:47:08.597 回答