UIViewController内存泄漏问题

Ari*_*sky 9 iphone camera memory-management

类似于有关创建和销毁UIImagePickerController实例的已知内存泄漏问题,我发现有关UIViewController类实例的类似问题.使用UIImagePickerController的推荐方法是创建一次实例并在应用程序的生命周期内保留它,尽管这会耗尽您在其他地方可能需要的内存.

我正在处理的情况涉及UIViewController类的2个实例.启动时,将创建第一个实例,并将其视图添加到另一个"main"UIViewController类,该类是MainWindow.xib的一部分.在第一个实例中是一个"信息"按钮,当点击时,切换到UIViewController类的新实例(如果尚未创建)."main"UIViewController使用通常的翻转动画来管理这种切换.基本设置可以在Dave Mark的"开始iPhone开发:探索iPhone SDK"一书中看到.

出现的问题是,一旦第一次点击"info"按钮,就会将内存分配给新的第二个UIViewController实例,并且在应用程序结束之前不会释放内存.由于此信息视图中的元素数量,一旦实例化它将使用大约1MB的内存,并且其视图将添加到超级视图中.任何一致地销毁和重新创建此实例的尝试都会导致内存泄漏,类似于当您尝试对UIImagePickerController类的实例执行相同操作时存在的内存泄漏.我怀疑两个类之间的根本原因是相同的.

我的问题的关键在于,在允许用户使用相机拍照之前,需要释放尽可能多的内存.但是,一旦用户拍照并且他们第一次看到结果图像,他们就可以点击第一个UIViewController实例上存在的"info"按钮.点击后,"main"UIViewController将删除现有的UIViewController视图,并将其替换为信息屏幕的视图.信息屏幕有一个"后退"按钮,可以将视图切换回来.但是,一旦用户离开信息屏幕并选择用相机拍摄另一张照片,分配给信息屏幕的内存仍然在内存中.

UIImagePickerController类临时使用大约15-18MB,同时在释放内部引用之前处理200万像素图像并调用"imagePickerController:didFinishPickingImage"委托.一旦通过信息按钮创建了第二个UIViewController实例,然后用户选择拍摄另一张照片,我就会遇到低内存警报.

无论你是否在我的情况下点击信息按钮一遍又一遍地拍摄照片,技术上都没有泄漏,但是由于你无法控制的iPhone(Safari等)背景处理的其他问题,你必须免费使用像相机这样的东西时,尽可能多的内存.

关于如何干净地创建和销毁UIViewController类的实例以使内存不泄漏的任何建议?

PCh*_*ese 4

您是否从 NIB 加载第二个视图控制器?如果是这样,您需要检查是否正确释放了关联的内存。

这是我的项目中典型的基于 NIB 的视图控制器的样子。

SomeViewController.h

@interface SomeViewController : UIViewController {
    UILabel *someLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *someLabel;

@end
Run Code Online (Sandbox Code Playgroud)

SomeViewController.m

@implementation SomeViewController

@synthesize someLabel;

- (void)dealloc {
    // Release our retained IBOutlets
    self.someLabel = nil;
    [super dealloc];
}

@end
Run Code Online (Sandbox Code Playgroud)