与有关创建和销毁 UIImagePickerController 实例的已知内存泄漏问题类似,我发现有关 UIViewController 类实例的类似问题。使用 UIImagePickerController 的推荐方法是创建一次实例并在应用程序的生命周期内保留它,尽管这会占用您在其他地方可能需要的内存。
我正在处理的情况涉及 UIViewController 类的 2 个实例。在启动时,创建第一个实例并将其视图添加到另一个“主”UIViewController 类,该类是 MainWindow.xib 的一部分。在第一个实例上是一个“信息”按钮,当点击该按钮时,将切换到 UIViewController 类的新实例(如果尚未创建)。“主” UIViewController 使用通常的翻转动画来管理这种切换。基本设置可以在 Dave Mark 的“Beginning iPhone Development: Exploring the iPhone SDK”一书中看到。
出现的问题是,一旦第一次点击“信息”按钮,内存就会分配给新的第二个 UIViewController 实例,并且直到应用程序结束才释放。由于此信息视图上的元素数量,它在实例化后使用大约 1MB 的内存,并且它的视图被添加到超级视图中。任何持续销毁和重新创建此实例的尝试都会导致内存泄漏,类似于您尝试对 UIImagePickerController 类的实例执行相同操作时存在的内存泄漏。我怀疑两个类之间的根本原因是相同的。
我的问题的症结在于在允许用户使用相机拍照之前需要释放尽可能多的内存。然而,一旦用户拍照并且他们第一次看到生成的图像,他们就可以点击第一个 UIViewController 实例上的“信息”按钮。一旦被点击,“主” UIViewController 将删除现有 UIViewController 的视图并将其替换为信息屏幕的视图。信息屏幕有一个“返回”按钮来切换视图。但是,一旦用户离开信息屏幕并选择用相机拍摄另一张照片,分配给信息屏幕的内存仍在内存中。
UIImagePickerController 类在释放其内部引用和调用“imagePickerController:didFinishPickingImage”委托之前处理 2 兆像素图像时临时使用了近 15-18MB。一旦通过信息按钮创建了第二个 UIViewController 实例,然后用户选择拍摄另一张照片,我就会遇到内存不足的警报。
在我的情况下,无论您是否一遍又一遍地点击信息按钮,内存在技术上都不会泄漏,但是由于您无法控制的有关 iPhone(Safari 等)上后台进程的其他问题,您必须释放在使用相机之类的东西时尽可能多地使用内存。
关于如何干净地创建和销毁 UIViewController 类的实例以使内存不泄漏的任何建议?