这是我写的一个示例,演示了两件事:
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
KVC观察者监视getter和setter方法。除非您绝对确定没有人会观察您的财产,否则您就会自找麻烦。有一个缺陷,那就是观察者很难处理部分已分配的对象,因此很难复制,几乎无法测试。
这对双方的开发人员来说都是一个宗教问题,ARC的到来使该问题更加混乱。
几个原因是:
对象未完全初始化,访问器可能依赖于完全初始化的对象。
访问器可能会有副作用,并且该对象再次没有完全初始化。一个常见的副作用是在首次使用时实例化iVar。
这些参数也适用于在dealloc
中使用访问器(对于非ARC代码)。
[在intiailiser方法和dealloc
中不使用访问器方法的主要原因,可能源于Mac OS X的开发,在iOS上可能不是什么大问题。 Mac OS X GUI开发涉及一个有用的东西,即“绑定”,它使您可以将控件的属性绑定到对象的属性,以便在用户更新控件时,“绑定”将自动更新该属性,如果程序更新属性(通过访问器方法),“绑定”将自动更新控件。
[键值观察(我认为)完成了很多绑定工作。键值观察是一个对象观察到其他对象的属性更改时的情况。每当您使用访问器方法更改属性时,任何正在观察您的对象的对象都会收到通知,以便它可以对属性的新值采取措施。当您不希望发生键值观察通知时,例如在初始化和释放过程中,使用访问器方法可以触发任何键值观察通知,因为对象的所有观察者将仅处理部分初始化或部分释放的实例,而不是全部实例初始化实例。
还有另一个主要关注领域,那就是对象被子类化时。当您使用访问器方法设置对象的属性时,您实际上将在调用子类的访问器方法(如果它实现了不同的访问器方法)。这不太可能成为问题,因为与.NET相比,Objective-C开发中的继承很少。