【发布时间】:2012-05-17 07:55:05
【问题描述】:
【问题讨论】:
-
您已经阅读了哪些关于该主题的材料?哪些位让你感到困惑?
-
你有没有看过我嵌入的链接。实际上,我的问题也是一个线程的主题。我做了一个编辑,所以你现在可以看到我的任务。
标签: ios objective-c memory-management
【问题讨论】:
标签: ios objective-c memory-management
这是我写的一个例子,它展示了两件事:
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 代码)。
【讨论】:
在 intialiser 方法和dealloc 中不使用访问器方法的主要原因可能源于 Mac OS X 开发,在 iOS 上可能不是什么大问题。 Mac OS X GUI 开发涉及一个有用的东西,叫做“绑定”,它允许您将控件的属性绑定到对象的属性,这样当用户更新控件时,“绑定”会自动更新属性,如果程序更新属性(通过访问器方法),“绑定”会自动更新控件。
很多绑定工作都是通过键值观察完成的(我认为)。 Key-Value Observing 是当一个对象观察到其他对象属性的变化时。每当您使用访问器方法更改属性时,将通知正在观察您的对象的任何对象,以便它可以对属性的新值执行操作。使用访问器方法可以在您不希望它们发生时触发任何 Key-Value Observing 通知,例如在初始化和释放期间,因为您的对象的任何观察者将只处理部分初始化或部分释放的实例,而不是完全初始化实例。
还有另一个主要的关注领域,那就是当您的对象被子类化时。当您使用访问器方法设置对象的属性时,您实际上将调用子类的访问器方法(如果它实现了不同的访问器方法)。这不太可能成为问题,因为与 .NET 相比,Objective-C 开发中的继承很少见。
【讨论】: