写高质量OC代码52建议总结:31.在dealloc方法中只释放引用并解除监听

对象在经历其生命周期之后最终会被系统回收,这时需要执行dealloc方法。在每个对象的生命周期内,此方法在保留计数降为0时只执行一次。绝不该自己调用dealloc方法,系统会在运行期适当的时候调用它。一旦调用了dealloc方法后,对象就不再有效了。
 在dealloc方法中,ARC会自动生成.cxx_destruct方法并自动添加。对象所拥有的其他非OC对象也要释放,比如CoreFoundation对象就必须手工释放,因为他们是纯C的API生成的。
 在dealloc方法中通常还要做一件事,把配置过的观测行为清理掉。如果手动管理引用计数,在方法最后还要调用[super dealloc]。ARC会自动执行此操作。
 开销较大或系统内稀缺的资源在dealloc中释放不太合适,比如,文件描述符、套接字、大块内存等,不能等系统调用dealloc时才释放,保留这些资源的时间就有些过长了。这种情况需要开发者实现清理方法。使用清理方法而不使用dealloc还有一个原因是系统并不会保证每个对象的dealloc都会执行。极个别情况,当应用程序终止时,仍有对象存活,这些对象没收到dealloc消息。由于程序终止,这些对象也相当于消亡了,不调用dealloc是为了优化程序效率,这也说明系统未必会在每个对象上执行dealloc。在iOS应用程序所对应的application delegate中,含有一个程序终止时调用的方法。如果一定要清理某些对象,在此方法中调用那些对象的清理方法。
 -(void)applicationWillTerminate:(UIApplication *)application
 如果对象还管理着某些资源,在dealloc中医药调用“清理方法”,检查是否已经清理,如果没有则执行清理方法。
 在dealloc中尽量不要调用方法,因为对象在此已接近尾声,在这里调用的方法或者异步执行某些任务,系统可能已经把对象摧毁,那么操作就会出问题。
 在dealloc中也不要调用存取方法。
 
 总结:
 1.在dealloc中,只做释放指向其他对象的引用并取消键值观测和通知。
 2.如果对象持有文件描述符等系统资源,应该专门写一个方法来释放此种资源。
 3.正常状态下使用的方法不能在dealloc中调用,因为此时对象已经处于正在回收的状态了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值