我有一個關於使用getters和實例變量的問題。我們來看一個例子。iOS使用實例變量或getter方法
假設我有在.h文件中:
@property (nonatomic,strong) NSString *name
,並在.m文件我合成,以這種方式變量:
@synthesize name = _name;
現在我的問題是:什麼是之間的區別使用方法:
[self.name aMethod]
和
[_name aMethod]
謝謝!
我有一個關於使用getters和實例變量的問題。我們來看一個例子。iOS使用實例變量或getter方法
假設我有在.h文件中:
@property (nonatomic,strong) NSString *name
,並在.m文件我合成,以這種方式變量:
@synthesize name = _name;
現在我的問題是:什麼是之間的區別使用方法:
[self.name aMethod]
和
[_name aMethod]
謝謝!
第一個通過getter方法訪問ivar。第二個直接訪問伊娃。由於它是一個簡單的綜合屬性,除了第一個調用另外的方法外,沒有什麼區別。但是,如果屬性是原子的或動態的,或者getter方法很複雜,那麼第一個實際上就是原子,而第二個實際上不是原子,第一個實際上會觸發吸氣劑,而第二個不會。而第二個呼叫被簡單地保持原樣
[[self name] aMethod]
:
簡單來說,編譯器第一次調用重新寫入。
[self.name aMethod]
相當於
[[self name] aMethod]
因此吸氣劑被稱爲並且該消息被髮送到它的結果。
在你的情況下,可見的結果將是相同的。
但是,如果吸氣劑不是微不足道的(即合成的),則可能不是這種情況。
通過獲取者的第一個調用 - 它等於[[self name] aMethod]
。第二個只使用直接訪問。
您通常應該傾向於使用訪問器,但有時您應該偏離該位置。最常見的情況是在部分構建的狀態下,例如初始化程序和dealloc
。原因是你應該小心地構造或銷燬你的狀態,而不是對你的對象的接口語義感興趣 - 也就是說,使用訪問器可能會產生負面的行爲和語義副作用。
更完整的上榜理由可以在這裏找到: Why would you use an ivar?