一个简单的问题。
如果我有一个属性和一个同名声明的 ivar:
在.h文件中:
(Reminder*)reminder;
@property(nonatomic,strong)(Reminder*)reminder;
在 .m 文件中,如果我使用 ARC,我应该使用 ivar 还是 init 方法中的属性?
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
reminder = reminder_;
}
return self;
}
或者我应该使用该属性来获得自动引用计数的好处,如下所示:
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
self.reminder = reminder_;
}
return self;
}
我不确定在对象初始化的哪个点可以使用点符号访问属性。
无论 ARC 如何,都在部分构造状态下使用直接访问:
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
reminder = reminder_;
// OR
reminder = [reminder_ retain];
}
return self;
}
这是因为self.whatever
将触发其他副作用,例如键值观察(KVO)通知,或者您的类可能(显式)实现或子类覆盖setWhatever:
——这可能会将部分初始化的实例暴露给其他 API(包括它自己的 API),这些 API 正确地假设它们正在处理一个完全构造的对象。
You could手动验证一个类是否能够在部分初始化的状态下运行,但这需要大量维护,并且(坦率地说)当其他人想要对您的类进行子类化时,这是不切实际或不可能的。它需要大量的时间和维护,并且这样做没有实质性的好处,特别是如果您尝试使用该方法作为约定。
因此保证正确性的统一方式是在部分构造的状态下使用直接访问,并避免使用访问器。
注意:我使用“部分构造”,因为初始化只是图片的一半;-dealloc
有类似的警告。
关于为什么应该在部分构造状态(ARC || MRC)中使用直接访问的更多详细信息可以在这里找到:初始化属性,点符号
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)