iOS 6弃用viewWillUnload并移至didReceiveMemoryWarning

Orp*_*ury 16 cocoa-touch objective-c didreceivememorywarning viewdidunload ios6

我是新开发者,即将推出我的第一款应用.我对viewDidUnloadApple的iOS 6发行说明中所述的弃用感到困惑:

在iOS 6中,现在不推荐使用UIViewController的viewWillUnload和viewDidUnload方法.如果您使用这些方法来释放数据,请改用didReceiveMemoryWarning方法.如果未使用此方法,也可以使用此方法释放对视图控制器视图的引用.在执行此操作之前,您需要测试视图不在窗口中.

为什么会这样?我应遵循哪些指导原则来确保此更改不会在我的应用中导致任何性能问题?

谢谢.

Jod*_*ins 18

根据Apple的说法,他们已经改进了内部存储器管理的视图,足以使通过销毁内容所获得的收益viewWill/DidUnload微乎其微.此外,他们有数据表明许多应用程序崩溃,因为应用程序无法正确处理这些通知,并执行与视图卸载无关的"其他"内容.

最后,内存警告现在被验证为在应用程序因内存不足而终止之前将获得的第一个也是唯一的警告,因此它确实是处理内存问题的地方.

所以,基本上,只需删除你的viewWillUnloadviewDidUnload方法.didReceiveMemoryWarning在适当的位置处理内存问题和任何其他视图控制器管理.

编辑

请问:那些"合适的地方"是什么?我曾经在View [Will/Did]消失的某些情况下使用ViewdidUnload并不完全足够.就像在导航控制器堆栈上走得更远.你还想进一步详细说明吗? - Dan1one

那要看.我知道那不是你想听到的,但这是事实:-)

一般来说,你应该避免不对称.因此,您应该使用对比方法"撤消"操作,您可以从中"执行"原始操作.一般来说,你应该能够viewDidUnloaddidReceiveMemoryWarning和中完成所有类型的工作dealloc.

这应该不会导致更改,因为无论如何你必须在这两个地方复制大部分代码.

我不知道你的意思是"进一步向下导航控制器堆栈"所以你需要澄清这个例子让我提供一个有用的响应.

一个使用的问题viewDidDisappear,并viewDidAppear是,它是很难知道什么时候有人出现,因为它实际上出现,或者因为那是在它消失的顶部...会导致它的视图.

这些API应该可以帮助您解决这些问题:

- (BOOL)isMovingFromParentViewController
- (BOOL)isMovingToParentViewController
- (BOOL)isBeingDismissed
- (BOOL)isBeingPresented
Run Code Online (Sandbox Code Playgroud)


Dar*_*ren 8

在iOS 6中,永远不会卸载视图.

这意味着,loadViewviewDidLoad只调用一次,并viewDidUnload不会被调用.因此,如果您的视图控制器用于viewDidUnload处理低内存条件,那么它将需要更改.

如果要响应内存不足的情况,didReceiveMemoryWarning请在此方法中实现并释放临时数据和对象.


小智 6

在iOS 6中,我们应该自己发布视图,做这样的事情

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

    if([self isViewLoaded] && self.view.window == nil)
    {
        self.view = nil;
    }
}
Run Code Online (Sandbox Code Playgroud)