1

在 iOS6 中不再调用 viewDidUnload,因此作为在 viewDidUnload 中执行一些必要操作的应用程序的解决方法,我已经这样做了:

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];


    // only want to do this on iOS 6
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) {
        //  Don't want to rehydrate the view if it's already unloaded
        BOOL isLoaded = [self isViewLoaded];

        //  We check the window property to make sure that the view is not visible
        if (isLoaded && self.view.window == nil) {

            //  Give a chance to implementors to get model data from their views
            [self performSelectorOnMainThread:@selector(viewWillUnload)
                                   withObject:nil
                                waitUntilDone:YES];

            //  Detach it from its parent (in cases of view controller containment)
            [self.view removeFromSuperview];
            self.view = nil;    //  Clear out the view.  Goodbye!

            //  The view is now unloaded...now call viewDidUnload
            [self performSelectorOnMainThread:@selector(viewDidUnload)
                                   withObject:nil
                                waitUntilDone:YES];
        }
    }
}

苹果拒绝这样的事情有先例吗?由于时间限制,我不能冒险让他们拒绝任何东西。

4

2 回答 2

1

苹果没有理由拒绝它,但他们删除它是有原因的。

手动调用它只是在问问题。我强烈建议让应用程序逻辑正确并以“正确”的方式进行。

编辑:再次查看该代码后,我对您的实现表示严重怀疑。调用选择器的整个构造(我们应该已经在主线程上!)并从超级视图中删除(它只是从它的所有者那里窃取视图而不告诉它)是不正确的。这是您真正希望从代码库中消除的代码类型。

于 2012-10-10T21:28:06.083 回答
0

他们没有理由拒绝这一点。通过弃用该方法,-[UIView viewDidUnload]它变得像任何其他方法一样。您可以将其视为一开始就从未存在过UIView,而您只是碰巧创建了一个名为-viewDidUnload.

如果内部仍然存在(它可能)并且您试图调用 Apple 的(现在是私有的)实现而不是您自己的实现,那么这是一个问题-viewDidUnload,但我非常怀疑 Apple 会这样做。请-viewDidUnload记住,如果这是您当前正在执行的操作,请记住在尝试在 super 上调用该方法之前询问超类是否实现了该方法,使用:

if ([[self superclass] instancesRespondToSelector:@selector(viewDidUnload)]) {
    [super viewDidUnload];
}

如果您真的想要安全,您可以随时将您的代码移动到不同的方法。如果你在 iOS 6 上,只需在里面viewDidUnload调用你的 iOS 5 设备的新方法和 in调用你的新方法。-didReceiveMemoryWarning

我不会对您的 didReceiveMemoryWarning 中的逻辑进行详细评论,因为这不是问题,但我会说您应该非常小心您将控制器置于的状态(确保那些 if 语句涵盖你所有的基础!)当然,当你调用 viewDidUnload 时,你不能期望你的视图控制器及其视图处于与 iOS 5 中 UIKit 调用它时相同的状态。

于 2012-10-10T21:23:51.010 回答