与已知的有关创建和销毁UIImagePickerController实例的内存泄漏问题类似,我正在发现有关UIViewController类的实例的类似问题。建议使用UIImagePickerController的方法是创建一次实例,并在应用程序的生命周期内保留它,即使这会耗尽您可能需要在其他地方使用的内存。
我正在处理的情况涉及UIViewController类的2个实例。启动时,将创建第一个实例,并将其 View 添加到MainWindow.xib的另一个“主” UIViewController类中。在第一个实例上是一个“信息”按钮,在点击该按钮时,将切换到UIViewController类的新实例(如果尚未创建)。 “主” UIViewController通过常规的翻转动画来管理此切换。可以在Dave Mark撰写的“开始iPhone开发:探索iPhone SDK”一书中看到基本设置。
出现的问题是,一旦第一次点击“信息”按钮,就会将内存分配给新的第二个UIViewController实例,并且直到应用程序结束才释放内存。由于此信息 View 中元素的数量,实例化后它将使用大约1MB的内存,并将其 View 添加到 super View 中。试图一致销毁并重新创建此实例的任何尝试都会导致内存泄漏,类似于您尝试对UIImagePickerController类的实例执行相同操作时所存在的泄漏。我怀疑两个类之间的根本原因是相同的。
我的问题的症结在于,在允许用户使用相机拍照之前,需要释放尽可能多的内存。但是,一旦用户拍摄了图片并且他们第一次看到了生成的图像,就可以允许他们点击第一个UIViewController实例上存在的“信息”按钮。点击后,“主” UIViewController将删除现有的UIViewController的 View ,并将其替换为用于信息屏幕的 View 。信息屏幕上有一个“后退”按钮,用于切换 View 。但是,一旦用户离开信息屏幕并选择使用相机拍摄另一张照片,分配给信息屏幕的内存仍在内存中。
UIImagePickerController类在释放其内部引用之前处理2兆像素的图像时会临时占用近15-18MB的空间,并调用“imagePickerController:didFinishPickingImage”委托(delegate)。通过信息按钮创建了第二个UIViewController实例后,我遇到了内存不足警报,然后用户选择拍摄另一张照片。
从技术上讲,无论我是否在不使用信息按钮的情况下一遍又一遍地拍照,内存都不会泄漏,但是由于与iPhone上的后台进程(Safari等)有关的其他问题超出了您的控制范围,因此您必须释放在使用相机之类的东西时要尽可能多地占用内存。
关于如何干净地创建和销毁UIViewController类的实例以使内存不泄漏的任何建议?
最佳答案
您是否正在从NIB加载第二个 View Controller ?如果是这样,您将要检查是否正确释放了关联的内存。
这是我的项目中典型的基于NIB的 View Controller 的外观。
SomeViewController.h
@interface SomeViewController : UIViewController {
UILabel *someLabel;
}
@property (nonatomic, retain) IBOutlet UILabel *someLabel;
@end
SomeViewController.m
@implementation SomeViewController
@synthesize someLabel;
- (void)dealloc {
// Release our retained IBOutlets
self.someLabel = nil;
[super dealloc];
}
@end