Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.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
Ios 在viewDidUnload中起作用的内容应移至didReceiveMemoryWarning?_Ios_Uiviewcontroller_Ios6_Didreceivememorywarning_Viewdidunload - Fatal编程技术网

Ios 在viewDidUnload中起作用的内容应移至didReceiveMemoryWarning?

Ios 在viewDidUnload中起作用的内容应移至didReceiveMemoryWarning?,ios,uiviewcontroller,ios6,didreceivememorywarning,viewdidunload,Ios,Uiviewcontroller,Ios6,Didreceivememorywarning,Viewdidunload,在新的iOS 6中,viewDidUnload已被弃用,我们已被指示使用didReceiveMemoryWarning来管理UIViewController实例和子类中的对象。在direceivememorywarning中为UIView类指定nils是否同样有效,就像在viewDidUnload中那样 我这样问是因为这两种方法的效果似乎不同。似乎didReceiveMemoryWarning不能保证再次调用viewDidLoad来重新实例化任何必要的UIView 我怀疑在iOS 6中,内存管理

在新的iOS 6中,
viewDidUnload
已被弃用,我们已被指示使用
didReceiveMemoryWarning
来管理UIViewController实例和子类中的对象。在
direceivememorywarning
中为UIView类指定nils是否同样有效,就像在
viewDidUnload
中那样

我这样问是因为这两种方法的效果似乎不同。似乎
didReceiveMemoryWarning
不能保证再次调用
viewDidLoad
来重新实例化任何必要的UIView


我怀疑在iOS 6中,内存管理是在不需要手动取消分配UIView的情况下完成的。请帮助我了解我在理解UIViewController的生命周期时遗漏了什么

在iOS参考中的
viewDidUnload:
,它指出这对于iOS 6是不推荐的,因为

在内存不足的情况下,视图不再被清除,因此 方法从未被调用


它没有说明如何将此代码放入
didReceiveMemoryWarning:
。由于在内存不足的情况下不再清除视图,因此您不必担心用这两种方法清理视图。

我现在首选的方法是:

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    if (self.isViewLoaded && !self.view.window) {
        self.view = nil;
    }
    // Do additional cleanup if necessary
}
请注意,测试
self.isViewLoaded
是必不可少的,否则访问视图会导致加载-即使是WWDC视频也会忽略这一点

如果对子视图的其他引用是弱引用,则不必在此处将它们设置为零,否则也要将它们设置为零


您应该完全摆脱
viewdindunload
,那里的每一个代码都应该移动到适当的位置。无论如何,它在iOS 6之前都不能保证被调用。

Eiko的回答不正确,当收到内存不足警告时,我们不应该将
self.view
设置为
nil
。这样做是没有用的,可能是有害的


iOS 6将自动释放当前未显示的视图位图,有关详细信息,请参阅。

这是正确答案。从ios6开始,消除视图不是您关心的问题。viewDidLoad不是不推荐的,viewDidUnload是。至于不是零,我建议观看WWDC 2012的视频,演讲者经常推荐这一点。同样,这不是必须的,但他们明确表示要在这里释放尽可能多的内存(包括视图)。文档中说,不再调用该方法,因为人们滥用该方法进行其他清理,并且经常依赖它。所以不,这个答案是不正确的。这是相当错误的。苹果刚刚给了程序员更多的控制权。当然,“在内存不足的情况下视图不再被清除”意味着你一定要担心清理
didReceiveMemoryWarning:
?否则视图将不会被释放,内存使用也不会减少。当然,我可能误解了文档的含义。解释iOS 6如何在
didReceiveMemoryWarning
上恢复内存,以及视图本身不再被清除的原因。@AdamHansch如果我的赏金引起了人们对这个问题的注意,那么提供赏金是正确的决定。我的想法和你的想法一模一样,我仍然不相信再也没有必要调用
viewDidUnload
。谢谢你的博文。另外,如果这是一件重要的事情,你不认为基本实现可以做到吗?你是对的,这不是必需的。对于基于图像的视图的草率实现,内存量可能会有很大的变化,从几个字节到几十兆字节不等。因此,我们可以轻松地发布它,但我们不必这样做。特别是对于许多控制器,这仍然是一个好主意,而且占用空间越小,应用程序在后台被杀死的可能性就越大。所以我的建议是,除非你确定它的价格便宜,否则最好不要买。当然,安装成本也需要考虑。