在 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/