【发布时间】:2009-08-03 19:57:37
【问题描述】:
现在,我在 dealloc 中完成大部分清理工作(清理 IBOutlets、分配的对象等)。为了让我的应用程序表现良好,我还应该在哪些其他地方进行清理工作?你能解释一下这些方法中通常会做的事情吗?
例如viewDidUnload、applicationWillResignActive等
【问题讨论】:
现在,我在 dealloc 中完成大部分清理工作(清理 IBOutlets、分配的对象等)。为了让我的应用程序表现良好,我还应该在哪些其他地方进行清理工作?你能解释一下这些方法中通常会做的事情吗?
例如viewDidUnload、applicationWillResignActive等
【问题讨论】:
对于视图,我通常会发布从 viewDidUnload 中的 NIB 文件创建的任何 UI 小部件。我在 viewController 的 dealloc 中清理的任何模型或其他对象。
有时我有从主数据对象创建模型的视图(比如节名到节行的字典)。如果我在 viewDidLoad 中创建/构建一个对象,我将在 viewDidUnload 中释放它(因为时机成熟时我的 viewDidLoad 会再次被调用)。
我相信在 SDK 3+ 中,您通常不必担心直接实现 didReceiveMemoryWarning,因为新的 viewDidUnload 方法是进行视图清理的主要地方。
对于普通对象(没有像视图控制器那样的特殊生命周期的对象)我只是在 dealloc 中释放它们的成员变量。
【讨论】:
别忘了:
- (void)didReceiveMemoryWarning
【讨论】:
注意:此“答案”仅与应用退出/终止有关。
根据我收到的my question 的答复,根本不需要进行清理工作,例如清理 IBOutlets、分配的对象等。只需在您的应用退出时保存状态(根据需要),然后让 iPhone操作系统处理最终清理。
【讨论】:
请注意,您的问题格式不正确。 UIApplication 的 -dealloc 方法永远不会被调用。应用程序委托的 -dealloc 永远不会被调用。这意味着您的应用程序的委托保留的任何对象都不会被释放,因此永远不会调用 它们的 dealloc。
您应该在应用程序委托的 applicationWillTerminate: 中进行清理 由于您的应用程序即将死机,您实际上不需要做任何事情,除了归还非内存资源,确保您的数据文件已正确关闭,并且您的 NSUserDefaults 已同步,以便您可以下次运行时正确重启。
然而,任何可能在程序生命周期内重复分配和解除分配的对象都应该使用适当的 Obj-C dealloc 方法,正如 Apple 所记录的那样,为所有类编写此方法是一种好习惯,即使它们不会被调用,只是为了让你养成良好的习惯,读者不会感到困惑。此外,当您确实创建和销毁其中的多个(例如在单元测试中)时,它还可以避免将来的维护问题。
【讨论】:
我会用
[yourObject release]方法,但将 yourObject 替换为对象
【讨论】: