我正在阅读有关内存管理的一些内容,他们不建议在初始化方法中使用访问器方法。
问题:为什么我们不应该在初始化方法中使用访问器方法?
我对此感到困惑。
这是我写的一个例子,它演示了两件事:
尽管该示例侧重于初始化,但dealloc
容易出现类似类别的问题。举一个具体的例子:一个对象可能会在 中部分复活dealloc
,引用计数不平衡成为潜在的危险。
简而言之,您希望专注于正确初始化和清理对象所需的数据——而不是通过任何子类关注对象的行为问题/影响。
更多阅读:
为什么 myInstance = nil 而不是 self.myInstance = nil?
对于双方的开发人员来说,这有点像宗教问题,而 ARC 的到来进一步混淆了这个问题。
有几个原因:
对象未完全初始化,访问器可能依赖于完全初始化的对象。
访问器可能有副作用,并且对象没有完全初始化。一个常见的副作用是在第一次使用时实例化 iVar。
这些参数也适用于在dealloc
(对于非 ARC 代码)中使用访问器。
KVC 观察者监视 getter 和 setter 方法。除非您绝对确定没有人会观察您的财产,否则您就是在自找麻烦。有一个缺陷,即观察者正在处理部分解除分配的对象,这很难重现并且几乎无法测试。
在 intialiser 方法中不使用访问器方法的主要原因dealloc
可能源于 Mac OS X 开发,并且在 iOS 上可能不是什么大问题。Mac OS X GUI 开发涉及一个有用的东西,叫做“绑定”,它允许您将控件的属性绑定到对象的属性,这样当用户更新控件时,“绑定”会自动更新属性,如果程序更新属性(通过访问器方法),“绑定”会自动更新控件。
很多绑定的东西都是用 Key-Value Observing 完成的(我认为)。Key-Value Observing 是当一个对象观察到其他对象属性的变化时。每当您使用访问器方法更改属性时,任何正在观察您的对象的对象都会收到通知,以便它可以对属性的新值采取行动。使用访问器方法可以在您不希望它们发生时触发任何 Key-Value Observing 通知,例如在初始化和释放期间,因为您的对象的任何观察者将只处理部分初始化或部分释放的实例,而不是完全初始化实例。
还有另一个主要的关注领域,那就是当你的对象被子类化时。当您使用访问器方法设置对象的属性时,您实际上将调用子类的访问器方法(如果它实现了不同的访问器方法)。这不太可能成为问题,因为与 .NET 相比,Objective-C 开发中的继承很少见。