苹果的消息机制是个非常好用的东西,当需要在类的各个实例之间传递消息或者写一些事件驱动的程序时,绝对是个不错的工具。但是使用时一不小心就会造成引用已经被dealloc的对象的错误,引起程序崩溃。于是,在合适的时机addobserver和removeobserver就是个很关键的事情。下面,分几种情况来阐述一下自己的一点想法。

一,使用defaultcenter。

简单的情况下,若自己没有太多的消息需要注册和处理,直接使用[NSNotificationCenter defaultCenter]来调用默认的消息中心就够用了。如果,有一些特殊的要求那么,就需要试一下一个继承自NSnotificationcenter的子类。

二,在视图显示的时候接受消息。

有些时候,我们需要在一个已经显示在主界面上的ViewController上做一点动作,比如当一个同步过程完成后,把同步的结果显示在界面上。但是,如果这个ViewController没有显示在主界面上的话,它就不关心同步结果是什么样子了。所以这个时候,我们可以在viewwillappear或者viewdidapper中addobserver添加消息监听。然后在viewwilldisappear和viewDidDisappear中removeObserver把消息注销掉。

三,在类的实例存在的时候接受消息。

很多时候,我们需要让一些类的实例只要在内存中,就要接受消息,处理一些事情。比如我们有一个管理同步的类SyncManager,这个类使用了单例模式,从它alloc init之后就需要一些监听同步的状态,并作出处理。这个时候,我们就需要在重写init函数,在其中注册消息。

- (id) init
{
self = [super init];
if(self)
{
[[NSNotificationCenter defaultCenter] addObserver........]
}
return self;
}

然后在dealloc中注销

- (void) dealloc
{
......
[ [NSNotificationCenter defaultCenter] removeObserver.......]
[super dealloc]
}

四,在viewController存在的时候接受消息

很多时候,我们会与ViewController打交道,甚至有些时候我们希望只要ViewController在内存中就监听一些消息作出一些动作。刚开始的时候,我想实现这个功能,我是这么写的

- (void) viewDidLoad
{
......
[[NSNotificationCenter defaultCenter] addObserver........]
.....
}
- (void) viewDidUnload
{
......
[ [NSNotificationCenter defaultCenter] removeObserver.......]
......
}

但是,在使用的过程中我发现viewDidLoad和Viewdidunload并不是成对出现的,只有在内存紧张和一些特定的情况下系统才会调用视图的ViewDidUnload来卸载视图。而ViewDIdload每一次加载都会执行。

也就是说removeObserver并不一定能够被执行到,这就留下隐患。当视图被dealloc之后,还在监听消息。最终会造成程序的崩溃。而且有些时候如果没有在unload中removeOberver还会造成多次注册同一个消息。造成同一个函数执行多次。引起不必要的麻烦。

然后,在使用过程中,经过多次试验我发现,使用init注册消息并在dealloc注销消息最为合适,就像第三条说的那样。在这里值得提醒的一点是苹果的官方文档上说:

The notification center does not retain its observers, therefore, you must ensure that you unregister observers (using removeObserver: or removeObserver:name:object:) before they are deallocated. (If you don't, you will generate a runtime error if the center sends a message to a freed object.)

意思是NotificationCenter并不会对Observer进行retain操作。因为就没有必要对observer做多余的release操作,而且,每一次注册,必须对应一次注销,不然,程序死翘翘的事情就会来了。

转:http://www.cnblogs.com/yishuiliunian/archive/2012/04/03/2431506.html

NSNotificationCenter消息注册与撤销的更多相关文章

  1. IOS学习之NSNotificationCenter消息机制

    NSNotificationCenter是 Cococa消息中心,统一管理单进程内不同线程的消息通迅. 添加观察者接收通知: //添加通知中心观察者 [[NSNotificationCenter de ...

  2. NSNotificationCenter消息机制的介绍

    转载自http://www.cnblogs.com/pengyingh/articles/2367374.html NSNotificationCenter的作用是专门提供程序中不同类之间的消息通讯而 ...

  3. NSNotificationCenter消息通信机制

    作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息 [[NSNotificationCenter defaultCenter] ...

  4. NSNotificationCenter消息通信(KVO)

    NSNotificationCenter是程序不同类间的消息通信. 注册消息通知: [[NSNotificationCenter defaultCenter]addObserver:self sele ...

  5. 关于NSNotificationCenter消息通信用法

    NSNotificationCenter主要用于广播消息到多个监听着,其传统用法 - (void)viewDidLoad { [super viewDidLoad]; [[NSNotification ...

  6. iOS设计模式之NSNotificationCenter 消息中心

    消息中心模式和KVO模式有点相似,差别在于.KVO  模式是意图在于监听摸一个相应的值的变化.而去出发一个方法相应的动作.而消息中心在于,广播.它就像一个广播基站,发送一条消息,在全部的加入监听的地方 ...

  7. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  8. MVVM模式用依赖注入的方式配置ViewModel并注册消息

    最初的想法 这次主要讨论下给View指定ViewModel的事情.一般来说给View指定ViewModel常用的方式有两种,一种是在View的后台代码中写DataContext = new ViewM ...

  9. Posix消息队列

    转载于:http://blog.csdn.net/zx714311728/article/details/53197196 1.消息队列 消息队列可以认为是一个消息链表,消息队列是随内核持续的.队列中 ...

随机推荐

  1. oracle任务job

    1)创建测试表 1 create table test1(a date); 2)创建存储过程 1 2 3 4 5 create or replace procedure myproc as begin ...

  2. 乐视max2 在开发中无法打印某些logcat 解决方案

    乐视屏蔽了打印log.d等类型logcat.解决方案:拨号键盘 *#*#76937#*#* 出现页面后选最下面那个选项就有了.

  3. Android WebView 详解

    相关API 相关类介绍 WebResourceRequest 添加于API21,封装了一个Web资源的请求信息,包含:请求地址,请求方法,请求头,是否主框架,是否用户点击,是否重定向 WebResou ...

  4. java实战

    1.http://learning.happymmall.com/ http://www.happymmall.com/index.html  前台官网 http://test.happymmall. ...

  5. 移动端console.log()调试

    在微信或app进行开发的时候,没法直接查看console.log的输出内容,调试起来简直太痛苦了. 1.笨笨的方法 fiddler抓请求:追加dom节点,显示调试信息. var div =docume ...

  6. 什么叫“回归”——“回归”名词的由来&&回归与拟合、分类的区别 && 回归分析

    http://blog.csdn.net/denghecsdn/article/details/77334160

  7. Git(四)Git的分支管理

    一. 创建合并分支原理 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD指针严格来说不是指 ...

  8. ubuntu下root和安装mysql

    sudo password创建新的root密码: 1.用当前登录用户打开终端,在终端输入命令 sudo passwd,输入当前用户的密码然后回车 2.会提示输入新密码,输入完成后回车(http://w ...

  9. Orchard学习 02、orchard 路由

    Orchard对mvc路由重新做了包装,重写了asp.net的路由模块 一.路由模块类图 1.路由 Descriptor RouteDescriptor是对常规mvc路由的包装类,它的Route属性就 ...

  10. Codeforces 601C Kleofáš and the n-thlon 概率dp

    Kleofáš and the n-thlon 我们可以用dp算出比当前这个人得分少的概率, 然后人数乘概率就好啦. dp[ i ][ j ]表示进行了 i 轮 得分为 j 的概率, 因为每个人都是独 ...