内存泄漏,多个 UIViewControllers 的其他问题

Posted

技术标签:

【中文标题】内存泄漏,多个 UIViewControllers 的其他问题【英文标题】:Memory Leak, Other Problems with Multiple UIViewControllers 【发布时间】:2011-10-28 15:46:06 【问题描述】:

我们从 Xcode 中的基于 Window 的应用程序开始。在 `AppDelegate' 我们有

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    MainMenuViewController *mvc = [[MainMenuViewController alloc] initWithNibName:@"MainMenuViewController" bundle:nil];
    self.window.rootViewController = mvc;
    [mvc release];
    [self.window makeKeyAndVisible];
    return YES;

MainMenuViewController 可以创建其他几个UIViewController 派生类之一,这也允许用户返回主菜单。在MainMenuViewController 中,我们有以下内容:

SecondLevelViewController* slvc = [[SecondLevelViewController alloc]initWithNibName:@"SecondLevelViewController" bundle:nil];
[self.view.window addSubview:slvc.view];
[self.view removeFromSuperview];

SecondLevelViewController 有类似的代码返回到主菜单。这可行,但在来回多次后最终创建了两个类的一堆实例,显然需要以其他方式完成。虽然 Instruments 没有报告任何内存泄漏,但应用程序的总内存使用量继续增长,并且视图控制器的实时分配实例的数量也在增加。

我们认为对 removeFromSuperview 的调用会释放先前的视图控制器,但即使文档说应该这样做,这也不会发生。

我们还注意到需要调用release

SecondLevelViewController* slvc = [[SecondLevelViewController alloc]initWithNibName:@"SecondLevelViewController" bundle:nil];
[self.view.window addSubview:slvc.view];
[self.view removeFromSuperview];
[slvc release];  // < < < added this line

但这导致了SIGABRTunrecognized selector sent to...

UINavigationViewController 不太适合我们,因为用户需要能够返回到主菜单,无论他在菜单层次结构中的深度如何。

【问题讨论】:

【参考方案1】:

如果仍有引用,则不是泄漏。试试 Heapshot,有一个很棒的教程:bbum's weblog-o-mat

在:

[self.view.window addSubview:slvc.view];
[self.view removeFromSuperview];

您只是使用slvc 创建slvc.view,为什么不直接创建视图,因为不需要ViewController。

Re: UINavigationViewController 不太适合我们 你看过吗:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated

【讨论】:

有机会我会去看看 Heapshot,谢谢。至于为什么是视图控制器,我对苹果文档的理解是视图控制器处理每一屏数据。还有关联的NIB文件等问题。

以上是关于内存泄漏,多个 UIViewControllers 的其他问题的主要内容,如果未能解决你的问题,请参考以下文章

媒体基础多个视频播放导致内存泄漏和未定义时间范围后崩溃

如何解决内存泄漏问题?

多个 UIViewControllers 同时

将 UIViewControllers 保存在内存中

ThreadLocal和内存泄漏

ThreadLocal 和内存泄漏