对象在经历其生命周期之后最终会被系统回收,这时需要执行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中,含有一个程序终止时调用的方法。如果一定要清理某些对象,在此方法中调用那些对象的清理方法。
在dealloc中尽量不要调用方法,因为对象在此已接近尾声,在这里调用的方法或者异步执行某些任务,系统可能已经把对象摧毁,那么操作就会出问题。
在dealloc中也不要调用存取方法。
总结:
1.在dealloc中,只做释放指向其他对象的引用并取消键值观测和通知。
2.如果对象持有文件描述符等系统资源,应该专门写一个方法来释放此种资源。
3.正常状态下使用的方法不能在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中调用,因为此时对象已经处于正在回收的状态了