不再在ios6中调用viewDidUnload

Mar*_*tin 21 deprecated viewdidunload ios6

我刚刚安装了新版本的Xcode/ios6.viewDidUnload现在已折旧.

在苹果文档中,

viewDidUnload [...]在iOS 6.0中已弃用.在低内存条件下不再清除视图,因此永远不会调用此方法.

但是大量的应用程序正在使用此回调来释放其属性,例如:

- (void)viewDidUnload {
    [super viewDidUnload];

    self.recipientButton = nil;
    self.connectButton = nil;
    self.infoLabel = nil;
}
Run Code Online (Sandbox Code Playgroud)

这是发布IBOutlets的最佳做法.

那么,第一个问题:
iOS 6中这些现有应用程序会发生什么?他们会泄漏吗?

第二个:
发布IBOutlet属性的新推荐方法是什么?在dealloc方法?

Pra*_*wal 22

对于第一个问题:

您的ViewController将接收didReceiveMemoryWarning方法回调,您可以在此方法中忽略视图和其他组件

如需参考,请参阅WWDC 2012视频会议,了解EVOLLUTION OF VIEW CONTROLLER,如果您没有(我相信它们仅适用于注册开发人员,但不确定).

回答你的第二个.

[对象发布]; 在dealloc.在释放之前无需为对象分配nil.

  • 从视频控制器上的WWDC 2012视频中逐字逐句:"viewWillUnload和viewDidUnload.我们不再打电话给他们了.我的意思是,我们经历了一种成本效益方程和分析.在早期,有一个真正的性能需要我们确保在内存警告我们卸载视图.有各种图形和后备存储等等也将被卸载.我们现在卸载那些独立于视图,所以它不是那么大对于那些要卸载的人来说,我们有一笔交易,并且有很多错误可以指向 (7认同)
  • 卸载的视图没有被清除,在一天结束时我们认为不值得自动调用那些.所以我们要弃用这些方法.您仍然可以获得相同的行为.您的视图控制器仍将收到"didReceiveMemoryWarning",如果愿意,他们可以忽略该视图.它将按预期工作.您可能希望先检查您的视图是否在窗口之前没有.我提出这一点是因为一些应用程序实际上使用viewWillUnload,viewDidUnload作为摆脱其他资源的手段,这些资源不一定与 (3认同)
  • 视图本身,所以现在代码可能必须转移到didReceiveMemoryWarning." (3认同)

Tom*_*oka 9

我建议你使用IBOutlets的弱属性

@property (weak) IBOutlet UILabel * labelText;
Run Code Online (Sandbox Code Playgroud)

这样你就不需要在dealloc中做任何事情了.在iOS 6中,只是ViewDidUnload不会调用,iOS5或更早版本只是在发生内存警告时调用.