@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.property
和self.property = <new value>
。
編輯:
此外,將有用於經由信息分配訪問屬性(使用點存取語法或吸氣劑)與直接訪問的ivar一些額外的開銷,但它會幾乎在所有情況下都沒有區別。