Ios viewDidUnload弃用和向后兼容性

Ios viewDidUnload弃用和向后兼容性,ios,objective-c,memory-management,Ios,Objective C,Memory Management,NB:我看到有人在这方面问了一些问题,但似乎没有人能澄清我的疑问 在iOS6之前,在viewDidUnload中,所有插座、大量资源(如图像和声音)都设置为nil。在iOS6之后,由于不再卸载视图,因此情况不再如此。系统调用didReceiveMemoryWarning,建议在此处放置此类资源中和 那么,如果代码需要支持iOS4以上的所有内容,该怎么办?在运行iOS 4和iOS 5的设备上,viewDidUnload仍将被调用。在运行iOS6的设备中,只调用didReceiveMemoryWar

NB:我看到有人在这方面问了一些问题,但似乎没有人能澄清我的疑问

在iOS6之前,在
viewDidUnload
中,所有插座、大量资源(如图像和声音)都设置为
nil
。在iOS6之后,由于不再卸载视图,因此情况不再如此。系统调用didReceiveMemoryWarning,建议在此处放置此类资源中和

那么,如果代码需要支持iOS4以上的所有内容,该怎么办?在运行iOS 4和iOS 5的设备上,
viewDidUnload
仍将被调用。在运行iOS6的设备中,只调用
didReceiveMemoryWarning


这是否意味着我必须在这两个地方复制代码?在这两个地方调用通用方法是一种好方法吗?请提供您对业界如何处理这一问题的意见或方法。

didReceiveMemoryWarning
在iOS 2.0及更高版本中,因此为什么不将它从
viewDidUnload
移动到
didReceiveMemoryWarning
,您应该在
viewDidUnload
中删除依赖于视图及其控件的任何内容。这是设备上运行的iOS的一个功能。显然,如果设备运行的是6.0或更高版本,则不会卸载视图。无论如何,您应该清除
didReceiveMemoryWarning
中的缓存等

您不应该在这两个方法中复制代码,因为这是不必要的。在
viewDidUnload
中查看相关清除,在
didReceiveMemoryWarning
中执行缓存相关清除。而且,最重要的是,不要将特定于视图的清理从
viewDidUnload
(例如将
IBOutlet
引用设置为
nil
,这是Interface Builder用来添加到代码中的内容)复制到
didReceiveMemoryWarning
。如果您这样做并且在iOS 6中收到内存警告,您将丢失未删除视图的
IBOutlet
引用


请参阅
viewDidUnload
中的
nil
IBOutlet
参考中经常使用的界面生成器。这当然不应该移动到
direceivememorywarning
,因为这会给iOS 6用户带来问题。谢谢@Rob。这很有启发性,阅读您提供的链接完全澄清了我的问题。但问题仍然存在,如果iOS6 SDK中编写的应用程序在iOS5设备上运行,是否会调用viewDidUnload?@paiego Yes,
viewDidUnload
,如果(a)设备在6.0之前运行iOS;和(b)您收到内存不足警告;(c)视图不是当前视图(即,您已经对另一个视图控制器进行了模式/推送)。它是设备iOS版本的函数,而不是您编译所依据的版本的函数。在您停止支持iOS 5之前,您必须正确处理
viewDidUnload
@Rob:Ok,但正如jxpx777所指出的,自iOS 2以来,已经调用了didReceiveMemoryWarning。如果VC的子视图没有连接到窗口,为什么不用这个方法清除它呢。i、 e.viewDidUnload为您提供了didReceiveMemoryWarning无法提供的功能?@paiego
viewDidUnload
didReceiveMemoryWarning
的用途不同
viewDidUnload
是一个通知,通知您的视图已被发布,并允许您清除对它的任何引用(特别是在非ARC代码中有用)。这与didReceiveMemoryWarning有很大不同,didReceiveMemoryWarning是为方便您释放重新创建的对象而设计的,特别适用于非UI缓存等。我的主要观点是,如果您愉快地将
IBOutlet
引用的
nil
-ing从
viewDidUnload
移动到
direceivememorywarning
,那么在iOS 6设备上运行时,您的手上就会发生火车失事。