RGo*_*off 6 ios automatic-ref-counting xcode4.5
我是一个负责iOS遗留代码的大型团队的一员,目标iOS环境为4.3及更高版本.我见过其他开发人员检查来自NSObject但没有dealloc方法的类.我也看到UIViewController了不包括viewDidUnload方法的后代.当我询问这段代码时,通常的回答是"别担心,ARC现在会处理这个问题."
据我所知,viewDidUnload被调用时的iOS经验内存不足的条件下,由释放,可以通过调用来重新创建对象释放内存的目标viewDidLoad,而dealloc当对象的保留计数降为零叫.对于UIViewController对象和后代,这可能意味着之前可能会或可能不会调用'viewDidUnload' dealloc.
所以这是我的问题:在iOS 6之前的iOS版本上使用ARC时仍然需要dealloc和viewDidUnload方法吗?
如果答案是" 是的! "那么我将需要充分的理由和/或文件来进行论证.
期待您的回复.(感谢Tommy帮我收紧问题.)
Tom*_*mmy 14
viewDidUnload 已弃用.因此,无论ARC如何,您不仅不需要一个,而且不应该使用一个.陈述的理由是视图不再被低内存警告清除(大概是因为他们现在对总数的贡献太小而不值得响应性命中); 如果部分理由是很多人认为他们可以释放viewDidLoad内部创造的所有资源viewDidUnload而且仅此一项就可以防止泄漏,我不会感到惊讶.这不是真的,因为viewDidUnload只有在由于内存不足警告而卸载视图时才会调用它.它不会在正常生命周期中调用.
根据ARC的新规则:
如果需要管理除释放实例变量之外的资源,则可以实现dealloc方法.您不必(实际上您不能)释放实例变量
编辑:专门评论4.3+ ...
ARC不会viewDidUnload为您实现某个版本.viewDidLoad/ viewDidUnload循环的要点是,如果您retain出于任何原因而视图层次结构的任何部分,那么您将导致在低内存警告时不会自动释放,但这样做不会给您带来任何好处,因为只要下次加载视图,保留的任何内容都将替换为新副本.因此,如果您对strong IBOutlet下面的层次结构中的视图有所了解self.view,那么理想情况下,您将在期间将它们排除在外viewDidUnload.即使你有weak参考,这是一个很好的地方,以防止自己发扬任何悬挂指针.
从iOS 5开始,你可以使用自我归零的弱引用,因此viewDidUnload如果你支持5+,那么使用那些而不是实现将是你的方法.对于4.3,如果你使用强引用并省略,viewDidUnload你最终可能会像苹果希望的那样彻底避免对低内存警告的响应,但你不会泄漏内存.如果你使用弱引用,那么当你可能没有视图时,你需要小心不要引用任何这些对象(即,任何时候你没有显示但视图先前已加载 - setters控制器上也调整视图但受其他视图影响的是一个典型的例子;比如说你是否通过键值观察来更新字段.
您可以使用模拟器的"模拟内存警告"来测试和调试这些内容.
该dealloc弧提供将是不管的iOS版本相同.但是它只包含Objective-C对象.当他们说你不能释放实例变量时,他们就意味着它就是将字母发送release给他们.假设你有Core Foundation对象或者已经执行了纯C内存分配,那么你将需要实现一个dealloc处理所有这些的对象.
显然,仪器和泄漏工具是测试和调试该区域的方法; 在任何时候内存泄漏时要小心,以检查创建该内存的对象类型是否也被泄露.直接对象可以没问题,但是如果不是dealloc因为其他人泄露它,它的分配将出现在泄漏列表中.
viewDidUnload现已弃用,系统不再调用(从iOS 6开始).它从未像苹果希望的那样有用,而且比它的价值更麻烦.这与ARC无关.
dealloc在ARC下通常不需要,但在需要非ARC资源管理的情况下仍然是必需的.例如,如果您需要使用free()或以其他方式释放资源.它也是一个将自己视为观察者或代表的好地方.但现在许多课程都不需要dealloc.
| 归档时间: |
|
| 查看次数: |
7756 次 |
| 最近记录: |