gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:44:37 24 4
gpt4 key购买 nike

我们从 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 没有报告任何内存泄漏,但应用程序的总内存使用量继续增长, View Controller 的实时分配实例的数量也在增长。

我们认为对 removeFromSuperview 的调用会释放之前的 View Controller ,但即使文档说它应该释放它也没有发生。

我们还注意到需要调用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 对我们来说不太适用,因为用户需要能够返回到主菜单,无论他在菜单层次结构中有多深。

最佳答案

如果还有引用就不算泄漏。试试 Heapshot,这里有一个很棒的教程:bbum's weblog-o-mat

在:

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

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

回复:UINavigationViewController 对我们来说不太适用你看过吗:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated

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

关于ios - 内存泄漏,多个 UIViewControllers 的其他问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931607/

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