ios - 在 iOS 6 中将委托(delegate)设置为 nil

标签 ios ios6

在 iOS 6 之前,我们应该

- (void)viewDidUnload {
   self.someDelegate = nil;
   [super viewDidUnload];
}

现在 viewDidUnload 已被弃用,我们在哪里将委托(delegate)设置为 nil?谢谢!

最佳答案

在 iOS6 中收到内存警告时不再卸载 View 。所以在这种情况下 View 永远不会被卸载,viewDidUnload在 iOS6 中从未调用过。

如果您真的想模仿旧的行为(在收到内存警告时卸载 View ),您现在必须在 didReceiveMemoryWarning 中实现此行为。在测试 self.view.window 之后,您的 View Controller 的方法属性为 nil(意味着 View 不再出现在屏幕上,因此将被“卸载”,这意味着您处于与旧 viewDidUnload 案例相同的情况)。

-(void)didReceiveMemoryWarning
{
    if (self.isViewLoaded && !self.view.window)
    {
        // If view already loaded but not displayed on screen at this time (not attached to any window) then unload it
        self.view = nil;

        // Then do here what you used to do in viewDidUnload
        self.someDelegate = nil;
        ...
    }
    [super didReceiveMemoryWarning];
}

但请注意,如果您使用 ARC 和 iOS5+,通常不需要将您的委托(delegate)设置为 nil。多亏了weak property 属性和自动将弱变量和属性重置为 nil 的 Zeroing-Weak-References 机制如果他们指向的对象不再存在(从而避免悬空指针)。

[编辑] 正如@Martin R 在评论中所解释的那样,在 iOS6 中收到内存警告时不再卸载 View ,因此您不必管理这种收到内存警告的情况并考虑在那里释放您的委托(delegate)这个用例在 iOS6 中不会再出现了。

关于ios - 在 iOS 6 中将委托(delegate)设置为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12557048/

相关文章:

ios - 无法隐藏网络事件指示器

ios - View Controller 委托(delegate)返回 nil

ipad - webkit 变换比例使项目消失

ios - 如何测试ios6兼容性?

ios - UIBarButtonItem 在 ios6 中看起来很糟糕

ios - Swift - 如果在 View 外部触摸则隐藏 View

带有 uitabbarcontroller 的 ios 7 bottomLayoutGuide

IOS - 为图像添加阴影边框使其沉重且无响应

ios - Xcode 4.5.1 在归档时卡住

objective-c - 在 ios 6.0 上使用 facebook sdk 3.1 将视频上传到 facebook