2014-02-18 40 views

回答

2

區別很簡單:使用self.label = [[UILabel alloc] init]實際上會調用方法[self setLabel:[[UILabel alloc] init]],並且使用_label = [[UILabel alloc] init]將直接將值賦給實例變量。

在實踐中這是什麼意思是,使用點語法通常是最好的方法可能調用處理了很多的東西給你,其中包括:

  • 內存管理:例如,如果您聲明一個屬性爲'strong'或'retain'的屬性,那麼被調用的方法應該保留分配的對象。
  • 鍵值編碼通知:對於屬性,可能該類爲key-value coding compliant,這意味着調用的方法會將更改通知給觀察者對象。

爲什麼你不使用點語法?有兩個可能的原因:

  • 爲了避免副作用:一個好的做法是不使用的初始化方法裏面的點語法。這是因爲我們想要分配值但不希望被調用的方法出於安全原因的其他副作用。
  • 性能:這可能很少見,但也許您試圖實現高性能的方法,直接使用實例變量可以節省調用方法的成本。

如果您想了解更多信息,我建議您閱讀this iOS指南,其中詳細介紹了我在此提及的想法。

1

的不同之處在於:

_variable名字都是實例變量。

self.variable正在調用對象的getter方法。

在你的例子中,實例變量是自動生成的,你也不需要綜合你的屬性。

,如果你不使用ARC-

self.variable如果您標記與保留或強_variable完全不

解決內存管理的屬性將保留對您的對象在你的榜樣,真正重要的區別進場
+0

Xcode在幕後與一個名爲_xxxx的ivar合成@property xxxx。所以你不能說,_xxxxx是實例變量。 – Mani

0

在你的例子中,self.label會自我調用getter方法'label' - 這相當於調用[self label]_label是類實例屬性的後備存儲 - 即實例變量,與直接訪問標準變量沒有區別。沒有getter方法纏繞它。

區別是非常非常重要的,因爲您可以覆蓋屬性的getter/setter方法。您可能希望這樣做,例如,如果您想要將某些行爲更改與變量的狀態更改捆綁在一起。調用getter或setter維護這種行爲。調用getter也保留這個變量。

基本上,除非你知道你爲什麼喜歡在任何特定的例子中上課_label,那麼堅持使用getter self.label。在初始化期間,您可能想要使用_label的一種情況是,您需要設置getter可能帶來的快樂默認w/o行爲。

0

區別在於使用_label直接訪問實例變量(簡稱ivar),其中使用self.label實際上是調用[self setLabel:[[UILabel alloc] init]];

調用setLabel:方法會執行其他操作,例如可能保留該變量(取決於屬性的聲明方式),但也可以觸發其他副作用,如setLabel:方法中設置的那樣。這些副作用可能與數據驗證類似,也可能將該值同步到服務器。

相關問題