【问题标题】:If my application doesn't use a lot of memory, can I ignore viewDidUnload:?如果我的应用程序不使用大量内存,我可以忽略 viewDidUnload: 吗?
【发布时间】:2011-02-01 08:17:58
【问题描述】:

我的 iPhone 应用程序通常使用不到 5MB 的活动内存,即使在最极端的条件下也保持在 8MB 以下。 iPhone 2G 有 128MB 的 RAM,据我所知,一个应用程序应该只有 20-30MB 可以使用。

鉴于我从没想过会接近内存限制,我是否需要关心内存警告并在 viewDidUnload: 中将对象设置为零?我看到我的应用程序收到内存警告的唯一方法是,如果手机上的其他东西正在破坏内存,在这种情况下,整个手机都会表现得很愚蠢。我构建我的应用程序时从未使用 viewDidUnload:,因此如果我确实需要实现它,我需要检查一百多个类并添加代码。

【问题讨论】:

  • 将对象设置为nil 不会释放任何内存。在设置为nil 之前,您需要实际发送-release 消息给他们以解除分配。
  • 我的印象是 release 只能在 dealloc 中使用。我确实看到一些 SO 问题说 viewDidUnload: 是例外......但无论哪种方式,基本问题都是一样的。

标签: iphone cocoa-touch memory memory-management uikit


【解决方案1】:

是的,请释放所有不使用的内存!

此类行为是 Apple 不允许多个应用同时运行的原因之一。现在想象一下,有时他们会,所有程序都会这样写......

【讨论】:

  • 所以我继续实现 viewDidLoad: 并使用访问器将可视元素和出口设置为零(数百个类,只有几十个 viewControllers:p)。我明白你在说什么,尽管在这一点上,这似乎在理论上比在当前现实中更必要。如果 Apple 确实选择允许 iPad 或 iPhone 4G 进行多任务处理,我还是选择这样做以节省未来的任何问题。
  • 作为旁注,我现在问自己的一个问题是:对于我使用自定义 init 方法并在这些 init 方法中设置各种视觉元素的 viewControllers(并且在 viewDidLoad 中什么都不做),如何我要处理这个吗?根据文档,您应该只释放将在视图加载时重新加载的对象,但这不会生成另一个 customInit 调用...猜猜我有一些重组要做吗?
  • 首先,正如 KennyTM 所写,将成员设置为 nil 只会泄漏内存。你需要释放对象!其次,当然对于您在 viewDidUnload 中释放的成员,您需要在 viewDidLoad 中进行初始化。也许您应该深入了解developer.apple.com/mac/library/documentation/cocoa/Conceptual/… 并了解在分配、释放(或自动释放)对象时实际发生的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多