我应该在ARC的init方法中引用self.property吗?

一个简单的问题。

如果我有一个财产和一个同名的伊娃:

在.h文件中:

(Reminder*)reminder; @property(nonatomic,strong)(Reminder*)reminder; 

在.m文件中,如果我正在使用ARC,应该在init方法中使用ivar还是属性?

 - (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; } 

我不确定在对象初始化的哪一点,属性可以用点符号来访问。

在部分构build的状态下使用直接访问,无论ARC如何:

 - (id)initWithReminder:(Reminder*)reminder_ { self = [super init]; if (self) { reminder = reminder_; // OR reminder = [reminder_ retain]; } return self; } 

这是因为self.whatever会触发其他副作用,如键值观察(KVO)通知,或者您的类实现(显式)或子类覆盖setWhatever: – 这可能会暴露您的部分初始化实例到其他API (包括它自己的),正确地认为他们正在处理一个完全构build的对象。

可以手动validation一个类是否能够在部分初始化状态下运行,但是这需要大量的维护,并且当其他人想要为您的类进行子类化时(坦率地说)是不切实际的或不可能的。 这需要大量的时间和维护,而且这样做没有实质性的好处,特别是如果您尝试将此方法用作惯例。

所以保证正确性的统一方式是在部分构build的状态下使用直接访问,避免使用访问者。

注:我使用“部分构造”,因为初始化只是图片的一半; -dealloc有类似的警告。

关于为什么要在部分构造状态(ARC || MRC)中使用直接访问的更多细节可以在这里find: 初始化一个属性,点符号

不,你不应该!

你可以在这里find描述
另外苹果推荐不要这样做。 在这里阅读

我不确定在对象初始化的哪一点,属性可以用点符号来访问。

由于点符号仍然是Objective-C方法(实际上是在ObjC方法下的C方法),点符号或调用方法是非常安全的GIVEN该方法准备处理内存中的基础types无论他们碰巧处于什么状态。关于避免使用未经初始化(可能)车库内存段的正常规则仍然适用。 这是在初始阶段使用伊娃最强的动机。

但是,如果你的方法(getter | setter)能够正确地使用内存段 – 不pipe它是否在被读取之前首先被写入 – 那么在所有的方法中都要使用你的getter。 懒惰的getter利用了这样的假设:它将初始化的指针以“nil”开始,以决定执行初始化。 如果你不能承担你的记忆的初始内容,那么初始化伊娃可能是最安全的过程。

为什么在这种情况下,如果方法能够正确运行,从不在init中使用setter或getter的规则?