我注意到在一些例子中,我看到你將設置一個引擎(類變量)爲_engine(ivar)。我不明白。這裏發生了什麼?Objective C confusion - 將合成變量設置爲ivars
這是我在說什麼的例子: @synthesize引擎= _engine,委託= _delegate
我注意到在一些例子中,我看到你將設置一個引擎(類變量)爲_engine(ivar)。我不明白。這裏發生了什麼?Objective C confusion - 將合成變量設置爲ivars
這是我在說什麼的例子: @synthesize引擎= _engine,委託= _delegate
這句法的屬性映射到一個實例變量(伊娃)使用不同的名稱。
所以:
@synthesize engine = _engine;
將創建一個訪問,而不是發動機_engine伊娃屬性訪問方法。您仍然可以訪問屬性格式爲:
object.engine
在Apple developer documentation on properties(部分財產公約實施指令)
如果伊娃的名稱不完全合成的變種的名稱相匹配,那麼你更多信息需要將伊娃映射到變種。如果你喜歡用下劃線給你的ivars加前綴,你可能想要這樣做。
作者想確保直接訪問伊娃和通過setter/getter訪問之間沒有混淆。如果名稱相同,通常情況下,很容易寫入: engine = 0而不是self.engine = 0;對於需要保留的ivar,如NSString,這可能會導致保留計數錯誤。
也有一個歷史性的優先命名ivars與領先的「_」,「米」或「f」,所以他們wpuld很容易被視爲伊娃。
@synthezise
關鍵字告訴Objective-C編譯器爲您的屬性生成getter和setter方法。如果您已經定義:
@property(copy,nonatomic) NSString* name;
然後@synthesize name;
會爲你創建這兩種方法,讓你不必爲落實這些:
-(NSString*)name;
{
return name;
}
-(void)setName:(NSString*)newName;
{
if (name != newName) {
[name release];
name = [newValue copy];
}
}
默認情況下所使用的實例變量的名字因爲合成屬性的後備存儲與屬性命名相同。這並不總是你想要什麼,然後你就可以合成爲@synthesize name = _otherName;
告訴編譯器,而不是爲你生成這個代碼:
-(NSString*)name;
{
return _otherName;
}
-(void)setName:(NSString*)newName;
{
if (_otherName != newName) {
[_otherName release];
_otherName = [newValue copy];
}
}
你平時前綴作爲後備存儲的性能的實例變量的原因帶下劃線的字符'_'是幫助你記住不要直接訪問它們。
在你的設置者中,'name'和'_othername'應該是autoreleased,而不是定期發佈。如果它們是傳遞參數newName的指針,那麼它可能會過早地解除分配。 – dreamlax 2009-09-17 21:33:37
正確,我更新了示例以反映此情況,但未使用autorelease,因爲這不是編譯器所做的。 – PeyloW 2009-09-17 21:36:20
Autoreleasing比單純的比較要貴很多,但我個人也是這麼做的,因爲沒有特別的葡萄乾。 – dreamlax 2009-09-17 23:40:43