我是否在实现中使用_property或self.property

时间:2012-10-09 01:55:11

标签: objective-c

  

可能重复:
  Difference between self.ivar and ivar?

假设我有以下课程

@interface
@property ( nonatomic, retain ) MyObject* property;
@end

@implementation
@synthesize property = _property;

-(id) init{
   if ((self = [super init])) {
        _property = [MyObject new];
        self.property = [MyObject new];
        NSLog(@"%@", _property.description);
        NSLog(@"%@", self.property.description);
    }
    return self;
}
@end

正确的方法是什么?使用访问器(合成:self.property)或直接使用ivar?只是当我尝试在其他文件中使用它时,我有时会觉得使用访问器会导致错误。

1 个答案:

答案 0 :(得分:5)

要么是好的。使用self.property调用getter或setter方法(合成或定义),而_property直接访问实例变量。

由于self.property调用方法,因此可能会产生副作用。例如:

- (Property *)property {
    if (_property == nil) {
        _property = [[Property alloc] init];
    }
    return _property;
}

调用self.property将创建一个新属性,如果在返回该值之前它不存在,则将其分配给_property,而_property如果在self.property之前访问它将指向n {第一次在此类的特定实例上调用{1}}。

实际上,@property声明不必与实例变量对应; -property方法的实现可以在每次调用时创建并返回一个新属性。