【问题标题】:Does UIImageView release resources when not in view?UIImageView 不在视图中时会释放资源吗?
【发布时间】:2012-01-31 11:13:18
【问题描述】:

UIImageView 不在视图中时会自动释放图像资源吗?也许当应用程序收到内存警告时?

如果没有,我正在考虑编写一个这样做的子类(例如SmartReleaseImageView),以便在有益的特定情况下使用。我在考虑这些方面的行为:

  • SmartReleaseImageView 收到setImage 消息时,它会向管理器注册自己,例如SmartReleaseImageViewManager
  • 当应用程序收到内存警告时,SmartReleaseImageViewManager 循环遍历其所有 SmartReleaseImageViews 并检查它们中的任何一个是否没有添加到超级视图中,或者检查它们中的任何一个是否有一个由于在外面而被剔除的框架主窗口的边界。
  • SmartReleaseImageView 检测到它已进入视野并被释放时,它会再次加载图像。所以也许,它首先需要有一个像setImageURL 这样的方法,而不是setImage

这种行为是否已经内置在UIImageView 中?或者它是否存在于任何地方的第 3 方版本中?还是想法有问题?

(我正在编写一个 UIImageView-heavy 应用程序,如果有一个全局性的包罗万象的解决方案可以帮助解决内存问题,而不是在我的UIViewControllers 中添加大量额外代码,那就太好了。)

编辑:到目前为止的答案表明UIViewController 应该负责。这是真的,我想我的特殊情况是非典型的。在我的例子中,UIViewController 可以包含许多自定义视图(具有自己的层次结构),它不一定知道其结构,并且经常进出视图。因此,它很难知道何时释放其资源。但是,是的,也许我应该找到一种方法来解决问题本身......

【问题讨论】:

  • 这听起来有点像您从错误的角度解决问题。 UIViewController 通常会在内存紧张时立即卸载其视图 - 对我来说,似乎您应该简单地依赖这些机制。

标签: ios memory-management uiimageview


【解决方案1】:

嗯,你实际上已经在 UIViewController 中实现了这种自动管理。由于 UIImageView 是 UIView 的子类,因此您的视图控制器应该能够自动管理它。

内存管理

内存是 iOS 中的关键资源,视图控制器提供 内置支持在关键时减少内存占用 次。 UIViewController 类提供了一些自动处理 通过其 didReceiveMemoryWarning 方法的低内存条件, 释放不需要的内存。在 iOS 3.0 之前,这种方法是 释放与自定义视图关联的额外内存的唯一方法 控制器类,但在 iOS 3.0 及更高版本中,viewDidUnload 方法 可能是满足大多数需求的更合适的地方。

当出现内存不足警告时,UIViewController 类会清除 如果它知道它可以稍后重新加载或重新创建它们,它的视图。如果 发生这种情况,它还会调用 viewDidUnload 方法来提供您的代码 放弃任何相关对象的所有权的机会 使用您的视图层次结构,包括使用 nib 文件加载的对象, 在 viewDidLoad 方法中创建的对象,以及延迟创建的对象 在运行时并添加到视图层次结构中。通常,如果您的视图 控制器包含出口(属性或原始变量包含 IBOutlet 关键字),您应该使用 viewDidUnload 方法 放弃这些网点或任何其他与视图相关的数据的所有权 你不再需要了。

来源:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

【讨论】:

    【解决方案2】:

    简答:
    UIImageView 不会释放资源,永远不会。
    但是当系统需要更多内存时,您的所有视图(包括UIImageView)都会被释放。请注意,您必须在[UIViewController viewDidUnload] 中发布您的意见。

    编辑: 不幸的是,当控制器不显示时它不起作用。在这种情况下,我建议手动清除 viewDidDissappear 中的组件(手动调用 viewDidUnload 并从视图层次结构中删除组件)。

    无论如何,如果一个视图控制器的层次结构中有太多图像,这将无济于事。在这种情况下,我建议创建一组 UIImageViews 并重用它们,就像 UITableView 重用其单元格一样。

    【讨论】:

    • 即使UIViewController 是当前/活动视图控制器,是否也会调用viewDidUnload
    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    相关资源
    最近更新 更多