内存泄漏,多个 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
但这导致了SIGABRT
和unrecognized 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 的其他问题的主要内容,如果未能解决你的问题,请参考以下文章