2013-03-19 40 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一些额外的开销,但它会几乎在所有情况下都没有区别。