为什么initWithCoder需要self.property?

时间:2014-06-18 12:58:14

标签: objective-c getter-setter initwithcoder

在访问变量时,我倾向于经常在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)。

这是对的吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题