UIImageView在不在视图中时是否释放资源?

时间:2012-01-31 11:13:19

标签: ios memory-management uiimageview

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

如果没有,我正在考虑写一个这样做的子类(例如SmartReleaseImageView),用于特别有利于这种情况的情况。我正在考虑这些方面的行为:

  • SmartReleaseImageView收到setImage消息时,它会向管理员注册,例如SmartReleaseImageViewManager
  • 当应用获得内存警告时,SmartReleaseImageViewManager遍历其所有SmartReleaseImageViews并检查其中是否有任何内容未添加到超级视图中,或检查其中是否有任何内容已被剔除由于超出了主窗口的范围。
  • SmartReleaseImageView检测到它已进入视图并已被释放时,它会再次加载图像。或许,首先需要使用setImageURL而不是setImage这样的方法。

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

(我正在编写一个UIImageView重型应用程序,如果有一个全局的全能解决方案可以帮助解决内存问题,而不是向我的UIViewControllers添加大量额外代码,那将是一件好事。 )

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

2 个答案:

答案 0 :(得分:1)

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

  

内存管理

     

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

     

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

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

答案 1 :(得分:1)

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

中发布您的观看次数

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

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

相关问题