我倾向于经常使用self.property在访问变量时我的Objective C代码,据我所知,这使用了getter/setter方法(显式编码或自动生成)。为什么initWithCoder需要self.property?
另一位编码员最近告诉我,最好在整个代码中使用_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除了在初始化/ dealloc的方法,其中_property应使用(除利用initWithCoder,应当使用self.property)。
这是正确的吗?
我无法看到'initWithCoder:'代码'self.property'在'_property'不会的时候会有效。你明白'self.property'使用这个属性的_setter_来初始化它,而'_property'不会绕过setter,而是直接初始化属于你属性的_instance variable_这似乎奇怪:/ – nburk
当你说“让它工作”时,你遇到了什么错误。我没有看到原始的基于ivar的init有问题。编码员告诉你独占使用ivars是不正确的;这不是最佳做法。有一段时间ObjC社区内存在更多的分歧,但是Apple最终证明你应该使用除init和dealloc之外的访问器。 –
我刚做了一个测试,它可以同时处理'_data'和'self.data'。您定位的是哪个版本的iOS?更早的版本不会自动生成属性data的'_data'变量。 – Daniel