8

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

问题:为什么我们不应该在初始化方法中使用访问器方法?

我对此感到困惑。

4

4 回答 4

2

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

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

初始化属性,点表示法

尽管该示例侧重于初始化,但dealloc容易出现类似类别的问题。举一个具体的例子:一个对象可能会在 中部分复活dealloc,引用计数不平衡成为潜在的危险。

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


更多阅读:

为什么 myInstance = nil 而不是 self.myInstance = nil?

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

将保留属性设置为新创建的对象的最佳方法

于 2012-05-08T20:42:40.310 回答
1

对于双方的开发人员来说,这有点像宗教问题,而 ARC 的到来进一步混淆了这个问题。

有几个原因:

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

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

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

于 2012-05-08T20:26:01.203 回答
1

KVC 观察者监视 getter 和 setter 方法。除非您绝对确定没有人会观察您的财产,否则您就是在自找麻烦。有一个缺陷,即观察者正在处理部分解除分配的对象,这很难重现并且几乎无法测试。

于 2012-05-08T20:44:48.603 回答
0

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

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

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

于 2012-05-08T20:45:13.103 回答