Should I refer to self.property in the init method with ARC?(我应该在 ARC 的 init 方法中引用 self.property 吗?)
问题描述
一个简单的问题.
如果我有一个属性和一个用相同名称声明的 ivar:
if I have a property and an ivar declared with the same name:
在 .h 文件中:
(Reminder*)reminder;
@property(nonatomic,strong)(Reminder*)reminder;
在 .m 文件中,如果我使用 ARC,我应该使用 ivar 还是 init 方法中的属性?
in the .m file, should I use the ivar or the property in the init method if I'm using ARC?
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
reminder = reminder_;
}
return self;
}
或者我应该像这样使用该属性来获得自动引用计数的好处:
Or should I use the property to get the benefit of the automatic reference counting like this:
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
self.reminder = reminder_;
}
return self;
}
我不确定在对象初始化的哪个时间点可以使用点符号访问属性.
I'm not sure at which point in the object's initialization the properties become accessible with the dot notation.
推荐答案
在部分构造的状态下使用直接访问,不管 ARC:
Use direct access in partially constructed states, regardless of ARC:
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
reminder = reminder_;
// OR
reminder = [reminder_ retain];
}
return self;
}
这是因为 self.whatever
会触发其他副作用,例如 Key-Value Observing (KVO) 通知,或者您的类实现(显式)或子类覆盖 setWhatever:
——这可能会将你部分初始化的实例暴露给其他 API(包括它自己的),这些 API 正确地假设它们正在处理一个完全构造的对象.
This is because self.whatever
will trigger other side effects, such as Key-Value Observing (KVO) notifications, or maybe your class implements (explicitly) or a subclass overrides setWhatever:
-- and that could expose your partially initialized instance to other APIs (including its own), which rightly assume they are dealing with a fully constructed object.
您可以手动验证一个类是否能够在部分初始化的状态下运行,但这需要大量维护并且(坦率地说)当其他人想要继承您的类时是不切实际或不可能的.它需要大量的时间和维护,这样做并没有实质性的好处,尤其是如果您尝试将这种方法用作惯例.
You could manually verify that a class is capable of operating in a partially initialized state, but that requires a lot maintenance and is (frankly) impractical or impossible when other people want to subclass your class. It requires a lot of time and maintenance, and there isn't substantiative benefit doing so, especially if you try to use the approach as a convention.
所以保证正确性的统一方式是在部分构造状态下使用直接访问,避免使用访问器.
So the uniform manner which guarantees correctness is to use direct access in partially constructed states, and avoid using the accessors.
注意:我使用的是部分构造",因为初始化只是图片的一半;-dealloc
有类似的注意事项.
Note: I am using "partially constructed" because initialization is only half of the picture; -dealloc
has similar caveats.
关于为什么应该在部分构造状态 (ARC || MRC) 中使用直接访问的更多详细信息可以在此处找到:初始化属性,点表示法
Some more detail as to why you should use direct access in partially constructed states (ARC || MRC) can be found here: Initializing a property, dot notation
这篇关于我应该在 ARC 的 init 方法中引用 self.property 吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:我应该在 ARC 的 init 方法中引用 self.property 吗?
基础教程推荐
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01