2015-06-17 26 views
5

無論何時我們創建屬性,自動生成getter-setter屬性,我都會在自我和下劃線之間混淆以訪問Objective c中的屬性。所以我們可以使用self.property和_property相同的屬性。在我看來,有些差別我沒有得到。請用實例告訴我。自我和下劃線訪問目標c中的屬性之間的區別?

回答

12

underbar(下劃線)版本是實際的實例變量,不應直接引用。您應該始終通過屬性名稱,這將確保任何getter/setter操作得到遵守。

所以,如果你做_property = 4,你直接設置變量。如果您使用self.property = 4,則您正在有效地調用方法調用[self setProperty:4],該方法將通過setter(可能會執行某些操作,例如強制屬性的最大值爲3,或更新UI以反映新值等)。

+2

使用屬性獲取器/設置器還具有觸發鍵值觀察器(KVO)的巨大優勢。 – Cyrille

+0

Cyrille - 謝謝。也許還有其他的優勢,我不知道,但我對Obj-C很缺乏經驗。 –

+0

對於「對Obj-C沒有經驗」的人來說,這是相當準確的答案。恭喜。 – Cyrille

3

當您使用self.XX時,您通過setter或getter訪問屬性。

當您使用_XX時,您直接跳過setter或getter訪問屬性。

1

比方說,你有定義的屬性如下:

@property (nonatomic,strong) NSString* name; 

name屬性的getter和setter將自動爲you.Now使用下劃線和自我之間產生的,所不同的是:

self.name [email protected]"someName"; // this uses a setter method generated for you. 
_name = @"someName"; // this accesses the name property directly. 

這同樣適用於獲取name屬性;

相關問題