不要在初始化方法和dealloc中使用访问器方法

时间:2012-05-08 19:36:00

标签: iphone objective-c memory-management

我正在阅读有关Memory Management的一些内容,他们不建议在初始化方法中使用访问器方法。

问题:为什么我们不应该在initilizer方法中使用访问器方法

我正在stackoverflow和其他网站上搜索有关此问题的引用。但是,我并不是很困惑。

任何人都可以就这个问题向我提出建议,或者你是否可以向我提出一个例子或一个好的参考资料,以便我可以自己去做。感谢

4 个答案:

答案 0 :(得分:2)

这是我写的一个例子,它展示了两件事:

  • 如何重新排序初始化
  • 如何引入泄漏

Initializing a property, dot notation

虽然该示例侧重于初始化,但dealloc容易受到类似问题的影响。作为一个具体的例子:一个物体可能在dealloc中部分复活,引用计数不平衡成为潜在的危险。

简而言之,您希望专注于正确初始化和清理对象所需的数据 - 而不是通过任何子类对对象的行为问题/影响。


更多阅读:

Why myInstance = nil instead of self.myInstance = nil?

Should I refer to self.property in the init method with ARC?

Best way to set a retained property to a newly created object

答案 1 :(得分:1)

这对双方的开发者来说都是一个宗教问题,ARC的到来使这个问题更加混乱。

有几个原因:

  1. 对象未完全初始化,访问者可能依赖于完全初始化的对象。

  2. 访问者可能有副作用,并且对象未再完全初始化。一个常见的副作用是在首次使用时实例化iVar。

  3. 这些参数也适用于在dealloc中使用访问者(对于非ARC代码)。

答案 2 :(得分:1)

KVC观察员监控getter和setter方法。除非你绝对肯定没有人会观察你的财产,否则你就是在寻找麻烦。有一个缺陷,观察者正在用一个部分dealloc'ed对象捣乱很难再现,几乎不可能测试。

答案 3 :(得分:0)

在ontiailiser方法和dealloc中不使用访问器方法背后的主要原因可能源于Mac OS X开发,并且在iOS上可能不是一个问题。 Mac OS X GUI开发涉及一个称为“绑定”的有用的东西,它允许您将控件的属性绑定到对象的属性,这样当用户更新控件时,“绑定”将自动更新属性,如果程序更新属性(通过访问器方法),“绑定”将自动更新控件。

很多绑定的东西都是通过Key-Value Observing完成的(我认为)。键值观察是指对象观察到对其他对象的属性的更改。每当使用访问器方法更改属性时,将通知观察对象的任何对象,以便它可以对属性的新值执行操作。使用访问器方法可以在您不希望它们发生时触发任何键值观察通知,例如在初始化和释放期间,因为您的对象的任何观察者将仅处理部分初始化或部分解除分配的实例而不是完全处理初始化实例。

还有另一个主要关注领域,那就是当你的对象被子类化时。当您使用访问器方法设置对象的属性时,您实际上将调用子类的访问器方法(如果它实现了不同的访问器方法)。这不太可能是一个问题,因为与.NET相比,Objective-C开发中的继承很少见。