不要在初始化方法中使用访问器方法,并取消分配[closed]

问题描述 投票:8回答:4

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

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

我对此感到困惑。

ios objective-c memory-management
4个回答
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
投票

KVC观察者监视getter和setter方法。除非您绝对确定没有人会观察您的财产,否则您就会自找麻烦。有一个缺陷,那就是观察者很难处理部分已分配的对象,因此很难复制,几乎无法测试。


1
投票

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

几个原因是:

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

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

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


0
投票

[在intiailiser方法和dealloc中不使用访问器方法的主要原因,可能源于Mac OS X的开发,在iOS上可能不是什么大问题。 Mac OS X GUI开发涉及一个有用的东西,即“绑定”,它使您可以将控件的属性绑定到对象的属性,以便在用户更新控件时,“绑定”将自动更新该属性,如果程序更新属性(通过访问器方法),“绑定”将自动更新控件。

[键值观察(我认为)完成了很多绑定工作。键值观察是一个对象观察到其他对象的属性更改时的情况。每当您使用访问器方法更改属性时,任何正在观察您的对象的对象都会收到通知,以便它可以对属性的新值采取措施。当您不希望发生键值观察通知时,例如在初始化和释放过程中,使用访问器方法可以触发任何键值观察通知,因为对象的所有观察者将仅处理部分初始化或部分释放的实例,而不是全部实例初始化实例。

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

© www.soinside.com 2019 - 2024. All rights reserved.