2013-03-19 83 views
5

我讀Apple Doc理解物業的實例變量,但有點糊塗需要更多關於Objective-C的性能概念援助

從蘋果文檔:

大部分屬性由實例變量的支持默認情況下, 讀寫屬性將由實例變量支持,編譯器將自動合併 。

實例變量是一個變量,它存在並保存其對象的生命值爲 。用於實例變量的內存是在首次創建對象(通過alloc)時分配的 ,並且在釋放對象時釋放了 。

除非另有指定,否則綜合實例變量的 名稱與該屬性相同,但帶有下劃線前綴。例如,對於名爲firstName的 屬性,合成實例 變量將被稱爲_firstName。

雖然它的最佳實踐爲對象來訪問使用存取方法或點語法其自身的屬性 ,它可以直接從任何實例方法訪問 實例變量在類 實現。下劃線前綴清楚地表明,你 訪問實例變量,而不是,例如,本地 變量:

如果使用的存取方法或點語法是最好的做法,那麼爲什麼用戶_ivarPropertyName?

爲什麼要用伊娃來呈現屬性?它有什麼好處?當蘋果說「使用訪問器方法或點語法是最佳實踐」

回答

6

@property聲明存在一個屬性(描述其接口),但沒有指定該屬性的實現。但屬性需要將其內容存儲在某處。默認情況下,編譯器爲該(和匹配的setter和getter)合成一個ivar。所以通常您可以忽略ivar的存在,並只使用點語法

我遵循Apple的建議,並儘量避免直接使用ivars。但有時你想訪問一個屬性而不用調用它的getter。在我的代碼最常見的例外是延遲初始化只讀屬性:

@interface MyObject : NSObject 
@property (nonatomic, readonly) id someProperty ; 
@end 

@implementation MyObject 
@synthesize someProperty = _someProperty ; // required; compiler will not auto-synthesize ivars for readonly properties 

-(id)someProperty 
{ 
    if (!_someProperty) 
    { 
     _someProperty = ... create property here 
    } 

    return _someProperty ; 
} 

@end 

而且,你可能不希望調用一個屬性的getter你-dealloc方法......例如,一個計時器屬性。爲了避免-dealloc創建一個計時器,直接訪問伊娃:

-(void)dealloc 
{ 
    [ _myTimer invalidate ] ; // don't use self.myTimer here, that would create a timer even though we're going away... 
} 

可能有更多的用例。對於大多數物業,你甚至不需要使用伊娃,只需使用<value> = self.propertyself.property = <new value>

編輯:

此外,將有用於經由信息分配訪問屬性(使用點存取語法或吸氣劑)與直接訪問的ivar一些額外的開銷,但它會幾乎在所有情況下都沒有區別。