1

在 iOS 6 之前,我们应该

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

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

4

3 回答 3

4

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

如果你真的想模仿旧的行为(在收到内存警告时卸载视图)你现在必须在didReceiveMemoryWarning你的视图控制器的方法中实现这个行为,在测试self.view.window属性为 nil 之后(意味着视图不再在屏幕上) ,因此将被“卸载”,这意味着您处于与旧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 和niliOS5 +,您通常不需要再将委托设置weaknilto 不再存在(从而避免悬空指针)。

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

于 2012-09-23T23:25:28.620 回答
3

好吧,我自己没有想出这个,但是如果应该对您有所帮助:“在 iOS 6 中,UIViewController 的 viewWillUnload 和 viewDidUnload 方法现在已弃用。如果您使用这些方法释放数据,请改用 didReceiveMemoryWarning 方法。您如果视图控制器的视图没有被使用,也可以使用此方法释放对视图控制器的视图的引用。在执行此操作之前,您需要测试视图是否不在窗口中。

http://www.bgr.com/2012/06/11/ios-6-beta-download-link-iphone-ipad-ipod-touch-release/

于 2012-09-23T23:16:10.177 回答
1

在 iOS 6 之前,我们应该

  • (void)viewDidUnload { self.someDelegate = nil; [超级 viewDidUnload]; }

你从哪里听到的?

你甚至知道viewDidUnloadiOS 6 之前的用途是什么吗?

viewDidUnload仅在内存不足的情况下调用,这会导致视图被卸载。在正常操作期间永远不会使用它。如果您依赖它被调用来做其他事情,那是错误的。

另外,你为什么还需要将self's delegate 设置为 nil 呢?“取消委托”是指将其他对象的委托(指向self)设置为何nilself被释放。Setting的委托没有意义(如果不再使用self,你为什么要关心设置东西?)。selfself

于 2012-10-31T00:26:13.567 回答