UINavigationController的替代方案

4
我正在开发一款类似“选择你的冒险”书籍结构的应用程序,其中包含大量多媒体内容(主要是照片和视频)。每个“页面”都是一个ViewController,用户必须完成一个拼图或其他任务才能进入下一个页面。
我正在创建一个UINavigationController,并将每个新的ViewController推到堆栈顶部。但我担心会出现内存问题,因为有一些重型多媒体内容,我没有弹出任何ViewController,90%的时间用户无法返回到前一个ViewController,只能前往新的页面。
我希望有一种替代方案,每次跳转到新的ViewController时,旧的ViewController都会从内存中释放。
3个回答

1
如果您不打算返回,则应该摆脱旧的UIViewController实例。在新的UIViewController实例被推入UINavigationController堆栈后,您可以这样做。
一种选择是在被推入navigationController的视图控制器的viewDidAppearviewDidLayoutSubviews方法中仅替换navigationController.viewControllers数组。这意味着您需要在每个UIViewController实例中使用它。
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    navigationController.viewControllers = @[viewController];
}

如果您正在使用一个主容器控制器来处理推送新的UIViewController实例,则第二个选项非常有用。只需实现UINavigationControllerDelegate协议并按照下面所示实现navigationController:didShowViewController:animated:方法即可。

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    navigationController.viewControllers = @[viewController];
}

在推送新实例后,它应该重置您的navigationController的控制器堆栈。

显然,您可以修改此逻辑,以便在某些时候不删除您想要返回的控制器。


看起来很有前途。我现在没有时间测试它,但我明天会测试并回来接受答案,如果有任何选项可以解决问题的话。 - guardabrazo
我尝试了你的第一个选项,将 self.navigationController.viewcontrollers = @[self] 添加到每个 ViewController 中,当我记录数组时,它只显示当前的视图控制器,正如预期的那样,但内存使用量仍然相同。查看您的解决方案的内存使用情况:这里 和没有使用它的情况 这里 - guardabrazo
@guardabrazo - 你的内存计数有6MB的差异。一个是278,另一个是272。这肯定会将它们从UINavigationController中移除,但如果它们在你的应用程序中的其他地方被保留,它们仍然会存在。 - Yas Tabasam
我创建了一个新的问题,并提供了一个示例项目供下载。请点击此处查看。 - guardabrazo

0
UINavigationController类允许您按照自己的方式读取和编写其使用以实现其堆栈的视图控制器数组。您不仅限于推送和弹出视图控制器。 在您的情况下,每当用户移动到应用程序的下一个“页面”时,您都应该评估是否需要保留最后一个。如果需要,您只需将其推入堆栈中;但是,如果不需要,则应将其从数组中删除,然后使用setViewControllers:animated:方法适当地设置视图控制器堆栈。

https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html


0

UIPageViewController 不显示时,是否会释放每个 UIViewController - guardabrazo
在分配实例时,如果您的代码是非ARC的,则可以传递autorelease;而在ARC的情况下,它将在不显示时释放这些实例。 - Raj

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