gpt4 book ai didi

iphone - UIViewController内存泄漏问题

转载 作者:行者123 更新时间:2023-12-03 18:33:03 24 4
gpt4 key购买 nike

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

我正在处理的情况涉及 UIViewController 类的 2 个实例。启动时,将创建第一个实例,并将其 View 添加到另一个“主”UIViewController 类,该类是 MainWindow.xib 的一部分。在第一个实例上有一个“信息”按钮,点击该按钮时,会切换到 UIViewController 类的新实例(如果尚未创建)。 “主” UIViewController 通过通常的翻转动画来管理这种切换。基本设置可以在 Dave Mark 所著的《Beginning iPhone Development: Exploring the iPhone SDK》一书中看到。

出现的问题是,一旦第一次点击“信息”按钮,内存就会分配给新的第二个 UIViewController 实例,并且直到应用程序结束时才会释放。由于此信息 View 上的元素数量较多,一旦实例化,它就会使用大约 1MB 的内存,并且其 View 将添加到 super View 中。任何持续销毁并重新创建此实例的尝试都会导致内存泄漏,类似于尝试对 UIImagePickerController 类的实例执行相同操作时存在的内存泄漏。我怀疑这两个类之间的根本原因是相同的。

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

UIImagePickerController 类在释放其内部引用并调用“imagePickerController:didFinishPickingImage”委托(delegate)之前处理 2 兆像素图像时暂时使用近 15-18MB。一旦通过信息按钮创建了第二个 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

关于iphone - UIViewController内存泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/608634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com