在访问变量时,我倾向于经常在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)。
这是对的吗?
答案 0 :(得分:1)
我不认为您必须使用initWithCoder:
中的属性。我有很多代码(并且已经看过很多),initWithCoder:
中使用了ivar访问,如果这可能有助于提示。
如果您没有使用ARC,那么您的实施设置_data
会出现问题,因为该对象很快就会被自动恢复。但是在ARC下你的代码是正确的。
所以,我倾向于认为不同的东西会导致你的问题。例如,如果您使用KVO,则应使用属性,否则不会生成与KVO相关的通知。您应该提供更多信息,确定您认为_data
的分配是问题的原因,以及该问题在代码的其他部分中的明显影响。