2

在访问变量时,我倾向于在我的 Objective C 代码中经常使用self.property,因为我知道这会使用 getter/setter 方法(显式编码或自动生成)。

另一位编码人员最近告诉我,最好在整个代码中使用_property 。但我的理解是_property实际上只用于 init 和 dealloc 方法。

今天我在一些使用initWithCoder的代码中发现了一个错误。我在 initWithCoder 方法中使用_property并且不得不将其更改为self.property。这是在设置 NSData 对象时。这是原始代码:

@property (nonatomic, strong) NSData *data;

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (!self) {
        return nil;
    }
    _data = [decoder decodeObjectForKey:@"data"];
    return self;
}

我不得不把它改成这个,让它工作:

@property (nonatomic, strong) NSData *data;

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (!self) {
        return nil;
    }
    self.data = [decoder decodeObjectForKey:@"data"];
    return self;
}

我的问题是 - 为什么这里的initWithCoder是例外?如果普遍认为最好在 init 方法中使用_property,那么为什么initWithCoder会有所不同?

现在看来,一般规则是:

使用 self.property,除非在 init/dealloc 方法中,应该使用 _property(除了 initWithCoder,应该使用 self.property)。

这个对吗?

4

1 回答 1

1

我不认为您必须在initWithCoder:. 我有很多代码(并且已经看到很多)在其中使用了 ivar 访问initWithCoder:,如果这可能有助于作为提示。

如果您没有使用 ARC,那么您的实现设置_data将会出现问题,因为该对象很快就会自动关联。但在 ARC 下,您的代码是正确的。

所以,我倾向于认为是不同的东西导致了你的问题。例如,如果你使用 KVO,那么你应该使用属性,否则不会生成与 KVO 相关的通知。您应该提供更多信息,说明究竟是什么导致您认为分配到_data是问题的原因,以及该问题在代码的其他部分中的可见影响。

于 2014-06-18T13:09:48.370 回答