【发布时间】:2011-09-20 01:49:47
【问题描述】:
我应该什么时候释放我在程序中分配的所有内存?
因为我只有一个 viewDidLoad 方法用于我的业务。我应该只在 viewDidUnload 中将 dealloc 留空并进行清理吗?
【问题讨论】:
标签: cocoa-touch ios4 xcode4 viewdidload
我应该什么时候释放我在程序中分配的所有内存?
因为我只有一个 viewDidLoad 方法用于我的业务。我应该只在 viewDidUnload 中将 dealloc 留空并进行清理吗?
【问题讨论】:
标签: cocoa-touch ios4 xcode4 viewdidload
'dealloc' 在对象准备好被释放时使用(即,当对象的保留计数变为 0 时)。并且 viewDidUnload 会在视图卸载时调用,但可能不会立即释放,因为 UIViewController 的引用仍然由其他一些对象存储。
我个人的偏好是,对于'init'创建的对象,它们由'dealloc'释放,对于'viewDidLoad'创建的对象,它们由'viewDidUnload'释放。
【讨论】:
-viewDidLoad 可能会被多次调用,但在两者之间总会有一个-viewDidUnload 调用。但是,您在-viewDidLoad 中创建的内容也应在-dealloc 中清理,因为在释放控制器之前可能不会调用-viewDidUnload。
正如-viewDidUnload 的文档所说:
在内存不足时调用 视图控制器时的条件 需要释放它的观点和任何 与该视图关联的对象 释放内存。因为观 控制器经常存储对 视图和其他与视图相关的对象, 您应该使用此方法 放弃这些对象的所有权 这样他们的记忆就可以 回收。你应该只为 您可以轻松重新创建的对象 稍后,无论是在您的 viewDidLoad 方法或从您的其他部分 应用。你不应该使用这个 方法来释放用户数据或任何 其他不能提供的信息 很容易重新创建。
通常,视图控制器存储 使用插座对对象的引用, 这是一个变量或属性 包括 IBOutlet 关键字并且是 使用 Interface Builder 配置。一种 视图控制器也可以存储 指向它创建的对象的指针 以编程方式,例如在 viewDidLoad 方法。首选方式 放弃任何对象的所有权 (包括那些在奥特莱斯)是使用 对应的访问器方法 将对象的值设置为 nil。 但是,如果您没有 给定对象的访问器方法, 您可能必须释放对象 明确的。
没有提到-viewDidUnload会调用-dealloc,你不应该依赖它。
【讨论】: