在iOS 6之前,我们原本应该
- (void)viewDidUnload {
self.someDelegate = nil;
[super viewDidUnload];
}
现在不推荐使用viewDidUnload,我们在哪里将委托设置为nil?谢谢!
答案 0 :(得分:4)
在iOS6中收到内存警告时,不再卸载视图。因此,在这种情况下永远不会卸载视图,并且在iOS6中永远不会调用viewDidUnload
。
如果你真的想模仿旧的行为(在收到内存警告时卸载视图),你现在必须在测试{{1}之后在视图控制器的didReceiveMemoryWarning
方法中实现此行为。 }属性为nil(意味着视图不再出现在屏幕上,因此将被“卸载”,这意味着您处于与旧self.view.window
情况相同的情况)。
viewDidUnload
但请注意,如果您使用ARC和iOS5 +,由于-(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];
}
属性属性和Zeroing-Weak-References机制,您通常不再需要将委托设置为nil
。如果它们指向的对象不再存在(从而避免悬空指针),则自动将弱变量和属性重置为weak
。
[编辑]正如@Martin R在评论中解释的那样,当在iOS6中收到内存警告时,视图不再被卸载,因此您不必管理这种接收内存警告的情况并考虑释放您的委托那里因为这个用例不再出现在iOS6中。
答案 1 :(得分:3)
好吧,我自己没有想出来,但是如果应该帮助你:“在iOS 6中,UIViewController的viewWillUnload和viewDidUnload方法现已弃用。如果您使用这些方法发布数据,请使用didReceiveMemoryWarning方法如果没有使用,你也可以使用这个方法释放对视图控制器视图的引用。你需要在执行此操作之前测试视图不在窗口中。“
http://www.bgr.com/2012/06/11/ios-6-beta-download-link-iphone-ipad-ipod-touch-release/
答案 2 :(得分:1)
在iOS 6之前,我们原本应该
- (void)viewDidUnload { self.someDelegate = nil; [super viewDidUnload]; }
你在哪里听到这个?
您是否知道iOS 6之前的viewDidUnload
是什么?
viewDidUnload
仅在内存不足的情况下调用,导致视图被卸载。在正常操作期间永远不会使用它。如果你依赖它来做其他事情,那就错了。
另外,为什么你需要将self
的委托设置为nil呢? “Niling the delegate”指的是在释放self
时将其他对象的委托(指向nil
)设置为self
。设置self
的委托是没有意义的(如果self
不再使用,你为什么要在self
上设置内容?)。