使用ivars定义类内的属性值

使用ivars定义类内的属性值

问题描述:

访问链接到类方法内部的属性的私有ivar比使用其合成的getter/setter方法效率更高,还是效率相同? ......至于在:使用ivars定义类内的属性值

 

@implementation MyApp 

@synthesize name; 

- (void)loadView 
{ 
    _name = @"Savagewood"; // VS. 
    self.name = @"Savagewood"; 
} 

@end 
 

我猜后者需要更多的时间来执行,但我想知道他们建议应用程序开发人员使用的一致性和良好的编程技术着想,这两个任务是否基本上具有相同的时间复杂性。

+0

这不是一个重复的问题。答案可能是相同的,但它是一个完全不同的问题 –

+0

另请参见:[点符号与声明属性的消息符号?](http://*.com/q/1249392) –

+0

hmmm ..可能但它不直接与我谈论ivars –

一般来说,最好尽可能使用属性访问器,并限制直接使用实例变量到访问器方法,init方法和dealloc(如果不使用ARC)。相反,避免在init和dealloc中调用访问器,并避免使用它自己的访问器方法中实现的属性的访问器。

+0

那么我如何在init方法中设置变量?使用ivars? –

+1

@Savagewood绝对。直接在init方法中设置ivars而不是调用setter方法来避免副作用(如KVO通知)。还有一种可能是编码器方法可能被编码,以取决于另一个伊娃的价值,从而导致秩序问题。 – jlehr

后者实际上会调用属性name上的setter方法。如果你重写setter到类似

- (void)setName:(NSString*)name { 
    NSLog(@"New name: %@", name); 
    _name = name; 
} 

你会看到,设置伊娃直接不记录任何东西,但后者会触发日志。

在成本方面:我会说设置伊娃更便宜,但您节省的成本几乎可以忽略不计。我的方法是仅在必要时使用属性,例如当您需要对象的属性上的KVO时。否则,我总是使用伊娃。

+0

是的,我知道,但假设你不定制setter方法? –

+1

我会说设置伊娃是比较便宜,但是你节约的成本几乎可以忽略不计,我的方法是只在需要的时候使用财产,比如当你需要一个物体的财产时使用KVO,否则我总是使用一个伊娃。 – Enzo

+0

你介意发布这个答案吗?知道是否存在开发人员访问属性值的标准方式? –