2012-02-05 49 views
6

我有一個關於使用getters和實例變量的問題。我們來看一個例子。iOS使用實例變量或getter方法

假設我有在.h文件中:

@property (nonatomic,strong) NSString *name 

,並在.m文件我合成,以這種方式變量:

@synthesize name = _name; 

現在我的問題是:什麼是之間的區別使用方法:

[self.name aMethod] 

[_name aMethod] 

謝謝!

回答

8

第一個通過getter方法訪問ivar。第二個直接訪問伊娃。由於它是一個簡單的綜合屬性,除了第一個調用另外的方法外,沒有什麼區別。但是,如果屬性是原子的或動態的,或者getter方法很複雜,那麼第一個實際上就是原子,而第二個實際上不是原子,第一個實際上會觸發吸氣劑,而第二個不會。而第二個呼叫被簡單地保持原樣

[[self name] aMethod] 

簡單來說,編譯器第一次調用重新寫入。

1
[self.name aMethod] 

相當於

[[self name] aMethod] 

因此吸氣劑被稱爲並且該消息被髮送到它的結果。

在你的情況下,可見的結果將是相同的。

但是,如果吸氣劑不是微不足道的(即合成的),則可能不是這種情況。

0

通過獲取者的第一個調用 - 它等於[[self name] aMethod]。第二個只使用直接訪問。

您通常應該傾向於使用訪問器,但有時您應該偏離該位置。最常見的情況是在部分構建的狀態下,例如初始化程序和dealloc。原因是你應該小心地構造或銷燬你的狀態,而不是對你的對象的接口語義感興趣 - 也就是說,使用訪問器可能會產生負面的行爲和語義副作用。

更完整的上榜理由可以在這裏找到: Why would you use an ivar?