我知道實例變量和屬性。我經常看到有人初始化一個UILabel
這樣當初始化這些變量時使用self.variable和_variable之間的區別
self.label = [[UILabel alloc] init]; //and
_label = [[UILabel alloc] init];
那麼,什麼是使用self.label
和_label
設置對象之間的區別?
我知道實例變量和屬性。我經常看到有人初始化一個UILabel
這樣當初始化這些變量時使用self.variable和_variable之間的區別
self.label = [[UILabel alloc] init]; //and
_label = [[UILabel alloc] init];
那麼,什麼是使用self.label
和_label
設置對象之間的區別?
區別很簡單:使用self.label = [[UILabel alloc] init]
實際上會調用方法[self setLabel:[[UILabel alloc] init]]
,並且使用_label = [[UILabel alloc] init]
將直接將值賦給實例變量。
在實踐中這是什麼意思是,使用點語法通常是最好的方法可能調用處理了很多的東西給你,其中包括:
爲什麼你不使用點語法?有兩個可能的原因:
如果您想了解更多信息,我建議您閱讀this iOS指南,其中詳細介紹了我在此提及的想法。
的不同之處在於:
與_variable
名字都是實例變量。
self.variable
正在調用對象的getter方法。
在你的例子中,實例變量是自動生成的,你也不需要綜合你的屬性。
,如果你不使用ARC-
self.variable
如果您標記與保留或強_variable
完全不
Xcode在幕後與一個名爲_xxxx的ivar合成@property xxxx。所以你不能說,_xxxxx是實例變量。 – Mani
在你的例子中,self.label
會自我調用getter方法'label' - 這相當於調用[self label]
。 _label
是類實例屬性的後備存儲 - 即實例變量,與直接訪問標準變量沒有區別。沒有getter方法纏繞它。
區別是非常非常重要的,因爲您可以覆蓋屬性的getter/setter方法。您可能希望這樣做,例如,如果您想要將某些行爲更改與變量的狀態更改捆綁在一起。調用getter或setter維護這種行爲。調用getter也保留這個變量。
基本上,除非你知道你爲什麼喜歡在任何特定的例子中上課_label
,那麼堅持使用getter self.label
。在初始化期間,您可能想要使用_label
的一種情況是,您需要設置getter可能帶來的快樂默認w/o行爲。
區別在於使用_label直接訪問實例變量(簡稱ivar),其中使用self.label實際上是調用[self setLabel:[[UILabel alloc] init]];
。
調用setLabel:
方法會執行其他操作,例如可能保留該變量(取決於屬性的聲明方式),但也可以觸發其他副作用,如setLabel:
方法中設置的那樣。這些副作用可能與數據驗證類似,也可能將該值同步到服務器。
它只是一個約定,以表示它的私有變量。我相信在概念上是一樣的。 – Mutant