在dealloc方法中只释放引用和解除监听

对象在经历其生命周期后,最终会为系统所回收,这时候就要执行dealloc方法,在每个对象的生命周期内,此方法仅执行一次,也就是当保留基数将为0的时候。

你绝不应该自己调用dealloc方法,运行期系统会在合适的时候调用它。且,一旦调用过dealloc之后,对象就不再有效,后续方法调用均是无效的。

在dealloc中应该主要做些什么呢?

1.释放对象所拥有的引用:也就是把所有的OC对象都释放掉,ARC会通过自动生成的 .cxx_destruct方法,在dealloc中为你自动添加这些代码。对象所拥有的非OC对象也要释放。比如CoreFoundation对象就必须手工释放,因为它是由纯C的API所生成的。

2.解除监听:那就是把原来配置过的观测行为(observation behavior)都清理掉。包括KVO和NSNotificationCenter等通知。

3.不要再做其他事情。

需要注意的一些要点:

1.若对象持有文件描述符等系统资源,那么应该专门编写一个方法来释放此种资源。这样的类要和使用者约定:用完资源后必须调用相应地close方法。

2.执行异步任务的方法不应在dealloc中调用;只能在正常状态下执行的那些方法也不应该在dealloc中调用,因为此时对象已处于正在回收的状态了。

3.不要在dealloc中调用其他方法,包括属性的存取方法。

时间: 2024-10-13 19:02:13

在dealloc方法中只释放引用和解除监听的相关文章

Objective-C 内存管理之dealloc方法中变量释放处理

本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101ds8j.html (一).关于nil http://cocoadevcentral.com/d/learn_objectivec/ Calling Methods on Nil In Objective-C, the nil object is the functional equivalent to the NULLpointer in many other languages. The dif

Objective-C, 为什么不能在init或是dealloc方法中使用accessor方法

曾经阅读过苹果公司官方文档"Advanced Memory Management Programming Guide",对于为什么不能在init和dealloc方法中使用accessor方法一事,一直不明白.自己平时的工作实践中,貌似也没发现过有啥问题.直到今天,在调试一个错误的时候,才猛然间明白了其中的原因. 之所以不能在init和dealloc中使用accessor,是因为我们要提防:子类有可能会覆盖父类的accessor方法,并改变accessor方法的行为. 参考代码: #im

Java方法中传值和引用传递的问题(转)

说明:标题其实说法是错误的.Java中只有值传递,没有引用传递. ... ... //定义了一个改变参数值的函数 public static void changeValue(int x) { x = x *2; } ... ... //调用该函数 int num = 5; System.out.println(num); changeValue(num); System.out.println(num); ... ... 调用函数changeValue()前后num的值都没有改变. 值传递的过

JS 中的事件绑定、事件监听、事件委托

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

Android中Dialog对话框的调用及监听

Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter,C#中C/S中常用MessgeBox,总而言之就是一个功能弹,弹,弹,本文就简单的叙述一下Dialog的各种弹框使用及监听,顺便写了一个简单的自定义弹框,接下来请看正文: 一般对话框 先看下整个App页面: 看下一般对话框的结果: 具体代码的实现,其中定义了两个按钮,一个是确定(PositiveBu

关于Android自定义View中的onTouchEvent(MotionEvent event)事件监听

今天做一个自定义ViewGroup,通过addView动态添加子控件,为了省事,直接在父控件里重写public boolean onTouchEvent(MotionEvent event){}方法来监听当前触碰是哪个按钮,遇到点问题,所以写下来. 首先是点击效果只有 MotionEvent.ACTION_DOWN,这个把返回改为return true;就行了 然后是 getX()和getRawX()的区别,这个这篇博文有写到 http://www.cnblogs.com/foura/artic

文本框中的输入字的格式监听

限制文本框中只可以输入数字   JFoormattedTextField price= new JFormattedTextField(); price.addKeyListener(new NumberListener());//添加监听对象

Preference中如何增加activity生命周期监听

本文主要来介绍Preference如何根据Activit的生命周期做出一些逻辑. 1.Preference是android中的一个基本控件,在Preference下面派生出了SwitchPreference,CheckBoxPreference.ListPreference等众多的控件.这些控件作为一个结构体,被ListView加载,并按照Preference中自定义的布局结构inflate出来各种布局. 例如:Preference: protected View onCreateView(Vi

angularjs中 $watch 和$on 2种监听的区别?

1.$watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEquality); 每个参数的说明如下: watchExpression:监听的对象,它可以是一个angular表达式如'name',或函数如function(){return $scope.name}. listener:当watchExpression变化时会被调用的函数或者表达式,它接收3个参数