iOS视图控制器在关闭后内存没有被释放

8
当用户点击按钮时,会出现一个新的选项卡视图控制器,其中包含两个视图控制器。以下是我的做法。
ACLevelDownloadController *dvc = [[ACLevelDownloadController alloc] initWithNibName:@"ACLevelDownloadController" bundle:[NSBundle mainBundle]];
ACInstalledLevelsController *ivc = [[ACInstalledLevelsController alloc] initWithNibName:@"ACInstalledLevelsController" bundle:[NSBundle mainBundle]];
UITabBarController *control = [[UITabBarController alloc] init];
control.viewControllers = @[dvc, ivc];
dvc.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:0];
ivc.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:1];
[self presentViewController:control animated:YES completion:nil];

这个很好运行。我在ACLevelDownloadControllerACInstalledLevelsController中使用dismiss方法来解散视图控制器,这也很好运行。但奇怪的是,当我呈现视图控制器时,内存使用量却上升了。 enter image description here 但它从未下降。如果我再次呈现它,它甚至会再次上升 enter image description here 我正在使用ARC。为什么视图控制器使用的内存在被解散后没有释放?

编辑

ACLevelDownloadControllerACInstalledLevelsController都有IBActions连接到调用此方法的单击时,它们解散。
- (void)dismiss:(id)sender{
    [self dismissViewControllerAnimated:YES completion:nil];
}

你能提供用于解除的代码吗? - Gabriele Petronella
你可以尝试在self.presentingViewController上调用dismiss...方法,而不是在self上调用吗? - Gabriele Petronella
两者都没有任何代码块。 - Chris Loonam
这也让我崩溃了。我想不出为什么它没有释放所有东西。 - John Riselvato
你解决这个问题了吗?如果没有,尝试在iOS模拟器上模拟内存警告。我曾经遇到过类似的问题,并发现操作系统只有在真正需要时才会释放内存。 - Leonardo
显示剩余3条评论
1个回答

4
我们可以从内存使用图中观察到,tabViewController没有被正确地取消,导致它在堆栈中不断增加。在取消时,您必须允许呈现tabViewController的viewController来取消它。这是它的责任来解除呈现。同时,在 viewWillDisapper: 中保留 Outlet 的弱引用,并将任何强引用赋值为空**。您可以将一个视图控制器模态地呈现为对用户获取重要信息的临时打断。如果在这里不是这种情况,您可以去除模态呈现。请参考此链接。希望这有所帮助 :)

我无法手动从内存中释放它,因为我正在使用ARC。即使我仍然在呈现的视图控制器中有这个方法,也不应该[self.presentingViewController dismiss...]与将该方法放在呈现视图控制器中具有相同的效果吗?因为即使我这样做,它仍然没有从内存中消失。 - Chris Loonam
此外,这些是完全不同的视图控制器,需要以模态方式呈现。 - Chris Loonam
@ChrisLoonam 你不需要释放它,只需确保使用弱引用并将其设置为 nil。 - Lithu T.V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接