2013-07-21 69 views
1

下面是一個示例場景:使用指針,設置屬性,而不是發送對象消息

你有一個視圖控制器「ItemsViewController」,其中列出了一個UITableView「項目」。這一切都設置在導航控制器中,可以讓您更改UINavigationItem標題屬性的標題。我正在閱讀一本將保持無名的書籍,它在同一頁面上以兩種方式訪問​​此屬性,我不知道爲什麼;

使用指針

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

正在發送對象消息直

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

我瞭解這兩項工作(糾正我,如果我錯了)的指針指向navigationItem和當您更改屬性時,它將在導航項中更改它,否則將發送navigationItem setTi tle消息與更新的字符串。

然而,我真正的問題是,爲什麼你會在任何情況下以這種方式做到這一點?有沒有什麼時候這些方法之一有優勢?

回答

0

當你執行第二步時,編譯器會生成一個隱藏的臨時變量。在第一種情況下,爲編譯器定義臨時變量。

通常最好將「菊花鏈」操作分解爲連續的溫度分配(請分開行,請!)以使序列更清晰並使其更易於調試。通過拆分操作(並在單獨的行中),可以很容易地設置斷點,檢查中間結果等。並且在性能方面沒有「缺點」。

(這是很少有理由把多個語句放在同一行,並有很多理由做到這一點。)

+0

這就是我一直在尋找的。幕後發生了什麼。謝謝..所有好的答案。 – timlint

1

他們真的是一樣的。唯一的區別是,在第一種情況下,您持有對該對象的命名本地引用,而在第二種情況下,您沒有。

在2種形式之間進行選擇是個人偏好的一部分,也是你要調用對象的方法的一部分。如果您只打算調用一個方法,那麼命名局部變量的唯一真正好處是它使調試更容易。

+0

相同的一點是,當優化踢在發佈版本中,局部變量將完全優化不存在! – bbum

3

最終結果是一樣的。另一種選擇是:

self.navigationItem.title = item.itemName; 

使用中間變量的好處是可讀性和調試。很多時候,人們用5級嵌套方法調用發佈代碼,然後詢問爲什麼它不起作用。通過使用中間變量將這些調用拆分爲單獨的行,可以更輕鬆地讀取和調試代碼。但是對於這個例子,沒有什麼好處。

深入挖掘某些集合層次結構時,這非常有用。