Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-如何处理内存不足的问题_Iphone_Objective C_Memory Management_Didreceivememorywarning_Viewdidunload - Fatal编程技术网

iPhone-如何处理内存不足的问题

iPhone-如何处理内存不足的问题,iphone,objective-c,memory-management,didreceivememorywarning,viewdidunload,Iphone,Objective C,Memory Management,Didreceivememorywarning,Viewdidunload,当应用程序收到内存不足警告消息时,可能会发生3种情况: 您的应用程序刚刚启动,用户没有做任何特殊操作 应用程序正在运行,并且存在当前上下文 该应用程序位于后台,具有一些运行上下文 所以当你收到这条信息,你应该释放内存。。。但是在哪里呢?怎么做 我明白: initWith。。。。。必须设置默认的静态值 viewDidLoad必须加载任何非静态对象 didReceiveMemoryWarning必须释放这些非静态对象 我不知道在viewDidUnload中可以/必须做什么 我猜某些保留值必须在某个地

当应用程序收到内存不足警告消息时,可能会发生3种情况:

  • 您的应用程序刚刚启动,用户没有做任何特殊操作
  • 应用程序正在运行,并且存在当前上下文
  • 该应用程序位于后台,具有一些运行上下文
  • 所以当你收到这条信息,你应该释放内存。。。但是在哪里呢?怎么做

    我明白:

  • initWith
    。。。。。必须设置默认的静态值
  • viewDidLoad
    必须加载任何非静态对象
  • didReceiveMemoryWarning
    必须释放这些非静态对象
  • 我不知道在
    viewDidUnload
    中可以/必须做什么
  • 我猜某些保留值必须在某个地方设置为零。。。在你的记忆中得到警告了吗

    对于活动上下文(屏幕上事物的位置、显示的文本等)必须做些什么?因此,当再次调用viewDidLoad时,这些事物会再次显示,就像它们在memoryWarning调用之前的位置一样

    我的意思是,想象两种情况:

    情景1

  • 你正在做某事。。。您在字段中写入了一些文本,但没有保存,打开了另一个视图,在屏幕上移动了一个视图
  • 你在后台发送应用程序
  • 然后向应用程序发送一条记忆警告
  • 之后,用户将应用程序发送到前台:在当前视图和以前的视图中,应用程序应该像在退出时一样显示内容,但是如果所有内容都已发布,您将如何执行此操作
  • 场景2

  • 你正在做某事。。。您在字段中写入了一些文本,但没有保存,打开了另一个视图,在屏幕上移动了一个视图
  • 然后向应用程序发送一条记忆警告
  • 您不希望丢失视图上的内容,也不希望丢失前一个视图上的内容。您不希望屏幕因释放/重新加载功能而闪烁。你是怎么处理的
  • 所以,当这些内存警告发生时,除了将内容写入磁盘以稍后显示它们之外,您还有其他选择吗

    你什么时候再装?我有一个viewController,它可以加载(viewDidLoad),接收内存警告,卸载(viewDidLoad),但是当返回到它时,viewDidLoad不会被再次调用?是否必须在视图中执行此操作?我是否必须认为,只要触发ViewWillDisplay,我就可以假设应该在其上显示的内容已加载

    任何帮助,即使是有价值的链接,都将是伟大的


    谢谢您的帮助。

    我的想法是,当应用程序收到内存不足警告时,会调用两种方法:

    didReceiveMemoryWarning // in your NSObjects
    

    然后,如果您想释放内存,这些是要考虑的方法。

    关于你在那里能做什么。。。好。。。 想想Xcode的建议:

    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
        /*
         Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.
         */
    }
    
    - (void)didReceiveMemoryWarning {
        // Releases the view if it doesn't have a superview.
        [super didReceiveMemoryWarning];
    
        // Release any cached data, images, etc that aren't in use.
    }
    
    看起来,最好的选择是释放用户看不到和/或未使用的任何对象,或者释放您以后可以重新创建的任何缓存数据。 不要触摸你的GUI:如果你关闭它或它的一部分,你的应用程序将无法使用,用户会失望

    关于您的两个场景,我认为在考虑内存警告的用途时可能存在错误。 它们是一种处理紧急情况的方法,而不是管理内存的正常方法。 开发人员必须考虑良好的内存体系结构,并尽可能保存数据

    在场景1中,将应用程序发送到后台时保存数据

    applicationDidEnterBackground
    
    在场景2中,打开新视图时保存数据


    希望这是有意义的…

    考虑您的场景的替代方案。如果你的应用程序没有释放足够的内存,它可能会被杀死,这对用户来说会更加不和谐。人们可能会选择潜在地闪烁当前显示,而不是丢失用户有价值的数据。

    在我的情况下,最好是在闪烁时关闭应用程序。我没有用户数据,但是ap生成的内容。最好是这些内容丢失,而不是以非平稳的方式生成。
    applicationDidEnterBackground