@property
声明一个属性的存在(描述它的接口),但没有指定该属性的实现。但是属性需要将其内容存储在某个地方。默认情况下,编译器会为此合成一个ivar(以及匹配的 setter 和 getter)。所以通常你可以忽略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
此外,您可能不想在您的-dealloc
方法中为某个属性调用 getter……例如,计时器属性。为避免在 中创建计时器-dealloc
,请直接访问 ivar:
-(void)dealloc
{
[ _myTimer invalidate ] ; // don't use self.myTimer here, that would create a timer even though we're going away...
}
可能还有更多用例。对于大多数属性,您甚至不需要使用 ivar,只需使用<value> = self.property
and self.property = <new value>
。
编辑:
此外,通过消息调度(使用点访问器语法或 getter)访问属性与直接访问ivar 相比,会产生一些额外的开销,但在几乎所有情况下都没有区别。