gpt4 book ai didi

objective-c - 从 UINavigationController 堆栈中移除 Controller

转载 作者:可可西里 更新时间:2023-11-01 06:18:51 29 4
gpt4 key购买 nike

我不明白为什么在这种情况下 FirsViewController 没有被销毁/释放。

我的 AppDelegate.m - FirstViewController 被压入堆栈

self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
self.navigationController = [[UINavigationController alloc]init];

self.FirstViewController = [[FirstViewController alloc]
initWithNibName:@"FirstViewController"
bundle:[NSBundle mainBundle]];
[self.navigationController FirstViewController animated:YES];

FirstViewController.m

 self.SecondViewController = [[SecondViewController alloc]
initWithNibName:@"SecondViewController"
bundle:[NSBundle mainBundle]];
self.SecondViewController.totalNumberOfPlayers = self.selectedRow;
[self.navigationController pushFadeViewController:self.SecondViewController];
[self.view removeFromSuperview];

-(void)dealloc
{
[SecondViewController release];
NSLog(@"SecondViewController released");
}

当我运行应用程序并从第一个 View Controller 切换到第二个 View Controller 时,控制台中没有 NSLog 输入。这让我觉得第一个 View Controller 没有被销毁,它的内存也没有被释放。

似乎 [self.view removeFromSuperview] 在这种情况下效果不佳。

我的问题是如何释放/销毁 FirstController ?它永远不会在应用程序的其余部分使用。

最佳答案

你是正确的,堆栈中的 View Controller 没有被释放/销毁。这不是错误 - 这是设计使然,因为如果您弹出当前的 View Controller ,它将需要再次显示底层 View Controller 。该应用不知道您从未打算这样做。

您的 [self.view removeFromSuperview] 不起作用,因为它从窗口中删除了 View (当您推送第二个 View Controller 时,它已经被删除了)而不是从堆栈中删除 View Controller (我想您可能是混淆你的 View 和你的 View Controller )。

如果你想摆脱第一个 View Controller ,当你推送你的第二个 View Controller 时,而不是调用:

[navigationController pushViewController:secondViewController animated:YES];

改为调用它:

[navigationController setViewControllers:[NSArray arrayWithObject:secondViewController] animated:YES];

这将完全替换第一个 View Controller ,而不是仅仅将新 View Controller 推到它上面。动画将是相同的。

请注意,当您调用上述方法时,第一个 View Controller 将立即释放,因此在调用此方法后不要尝试对第一个 View Controller 执行任何操作,否则它很可能会崩溃。

更新:

您的应用委托(delegate)设置代码应如下所示:

self.window = [[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.navigationController = [[[UINavigationController alloc] init] autorelease];

FirstViewController *firstViewController = [[FirstViewController alloc] init];
[self.navigationController pushViewController:firstViewController animated:YES];
[firstViewController release];

注意事项:

  1. 不要将 firstViewController 存储在属性中,否则它不会在弹出时释放并且 dealloc 仍然不会被调用(您可以删除 firstViewController)属性。

  2. 变量名使用小写,类名只使用大写

  3. 始终释放或自动释放您在创建它们时使用相同方法分配/初始化的对象 - 这将避免分析器警告(并避免泄漏)。

  4. 如果 nib 文件名与 View Controller 类名匹配,则无需指定 nib 文件。

尼克

关于objective-c - 从 UINavigationController 堆栈中移除 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9208702/

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