Iphone 手动弹出内存警告中当前不可见的视图控制器(不同选项卡中的应用程序)可以吗?

Iphone 手动弹出内存警告中当前不可见的视图控制器(不同选项卡中的应用程序)可以吗?,iphone,cocoa-touch,ipad,memory-management,uinavigationcontroller,Iphone,Cocoa Touch,Ipad,Memory Management,Uinavigationcontroller,我有一个“内存管理vs用户体验”或者只是一个愚蠢的问题。让我们想象一个基于UITabBarController的应用程序,它有两个选项卡。当用户处于第一个选项卡时,内存警告到达,第二个选项卡的视图控制器处理didReceiveMemoryWarning。我们还假设第二个选项卡有一个推式视图控制器。问题: 在第二个窗口手动弹出VC可以吗 附页 popViewControllerAnimated: 是否发出内存警告 它被认为是糟糕的用户体验还是糟糕的用户体验 mem管理理念?我想用户可能会 对他/她

我有一个“内存管理vs用户体验”或者只是一个愚蠢的问题。让我们想象一个基于
UITabBarController
的应用程序,它有两个选项卡。当用户处于第一个选项卡时,内存警告到达,第二个选项卡的视图控制器处理
didReceiveMemoryWarning
。我们还假设第二个选项卡有一个推式视图控制器。问题:

  • 在第二个窗口手动弹出VC可以吗 附页
    popViewControllerAnimated:
    是否发出内存警告
  • 它被认为是糟糕的用户体验还是糟糕的用户体验 mem管理理念?我想用户可能会 对他/她所看到的感到惊讶 切换回第二个选项卡后,但是 如果我不弹出该VC,用户将 只看到一个空白屏幕。如果用户点击“后退”,第二个选项卡VC将重新加载自身(使用
    viewDidLoad:
    重新启动生命周期,这比被iOS杀死的应用要好)
  • 我在上述方法中看到的唯一缺陷是,我推的VC也推了一些VC。然后,代码会变得复杂。。。如果还有其他问题,这会使我的代码变得更加复杂,难以维护:

    - (void)didReceiveMemoryWarning {
        UIViewController *pushedController = [self.navigationController visibleViewController];
        if ([pushedController isKindOfClass:[MyController class]]) {            
            // POP
            [self.navigationController popViewControllerAnimated:NO];
        } else {
            // MyController pushed something
            UIViewController *innerController = [pushedController.navigationController visibleViewController];
            if ([innerController isKindOfClass:[MyOtherController class]]) {
                [innerController.navigationController popViewControllerAnimated:NO];
                // Final POP
                [self.navigationController popViewControllerAnimated:NO];
            }
        }
    
        [super didReceiveMemoryWarning];
    }
    

    你的方法/建议是什么?也许已经有了一个简单的方法,但我忽略了它?

    任何未定义的行为都肯定意味着糟糕的用户体验。当控制器收到内存警告时,最好的方法是释放任何缓存的图像、视图(不在视图中)、变量(不在使用中)。您可能希望应用程序的设计方式确保上述场景中的内存管理不会导致未定义的行为。您的应用程序可能不想占用所有内存,也不知道如何释放内存


    它应该能够释放不需要的内存并处理警告。您可能需要指定您所持有的数据类型,以便在此处获得更具体的响应。

    您是对的,但是,对于给定的控制器,我不能释放任何内容,否则,该控制器将不得不重新加载自身(如果没有推送VC,这很好)。如果我的应用程序收到严重内存警告怎么办?在这种情况下,视图将由iOS强制卸载,对吗?我认为在这种情况下,它应该清理它的导航堆栈,对吗?将
    poptrootviewcontrolleranimated
    添加到
    viewDidUnload
    有意义吗?如果有应用程序这样做,您会喜欢它吗。作为开发人员,只要我们知道为什么要这样做,我们就不会介意。但最终用户可能显然不喜欢它。顺便说一句,如果我必须使用你的应用程序,我会完全理解;-)。是的,最终用户透视图是最重要的:)我想,我会将导航堆栈清理移到
    viewDidUnload
    -如果视图被卸载,我认为这不重要。非常感谢您的回答:)稍后,如果没有人发布更好的答案,我会接受您的答案-这很好地指导了我:)总是有一些技术可以使用更少的内存,尤其是在加载图像等时。您可以在谷歌或搜索这里以获取更多信息。