Obj-c的基本通讯原则是对象间的消息传递,这种情况多出现在两个对象之间。但是如果多个对象共同关注一个对象状态的时候呢,当然可以让发生事件的对象向所有关注他的对象发送消息,但是这并不高效。所以有了通告中心,让发生事件的对象向通告中心发布通告,然后由通告中心向注册成为观察器的对象发布通告。

若将某个对象注册为观察器,需要制定通告名称、发布通告的对象和接收相应通告的方法的方法名。比如我将self注册为观察器,通告名称是getMarried,发送对象可以是任意对象,则当任何一个对象发布getMarried通告时,self对象就会收到blessing:消息

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(blessing:) name:@"getMarried" object:nil];

这个通知中心的工作流程大概如下图

需要注意的是,如果程序已经释放了某个注册成为观察器的对象,却没有将其移出通告中心,那么发送"getMarried"事件时,就会向原有的引用发送消息而导致程序崩溃。所以在释放时需要将其移出通告中心。

- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}

UIDevice通告

UIKit中的UIDevice对象可以不间断的发送通告

    UIDevice *device = [UIDevice currentDevice];
device.batteryMonitoringEnabled = YES; NSNotificationCenter *nc = [[NSNotificationCenter alloc] init];
[nc addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:device];

UIDeviceBatteryLevelDidChangeNotification是一个常量,表示电量发生改变时发布通告,处理方法是batteryLevelChanged:

- (void)batteryLevelChanged:(NSNotification *)note
{
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"电量改变"
message:@"电量发生了改变"
delegate:nil
cancelButtonTitle:@"知道了" otherButtonTitles:nil];
[av show];
}

UIDevice对象发布通告的常量除了电量改变以外还有

UIDeviceOrientationDidChangeNotification         // 传感方向发生变化通告

UIDeviceBatteryStateDidChangeNotification       // 电池状态发生变化通告

UIDeviceProximityStateDidChangeNotification   // 设备靠近面部时通告

Cocoa Touch中的其他很多类也会发布通告,如UIApplication,MPMoviePlayerController,NSFileHandle等等。

通告机制Notification的更多相关文章

  1. objective-c 通告

    1. 通告和委托的区别 通告也能传递与事件相关的数据.通告不同于委托的地方在于,通告是在对象执行完成动作之后产生,而不是之前.受到通告的对象没有机会建议是否要执行动作,而且对象的通告可以有多个监听者( ...

  2. MFC消息反射机制

    消息反射机制要解决什么问题呢? 消息反射机制主要是为了控件而实现的.每当控件需要某些资讯(比如,绘制自身背景的画刷,显示字体的颜色等等)时,都会频繁地向其父窗口发送通告消息(notification ...

  3. windows消息机制详解(转载)

    消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.消息本身是作为一个记录传递给应用程序的 ...

  4. iOS NSNotification的使用

    如果在一个类中想要执行另一个类中的方法可以使用通知 1.创建一个通知对象:使用notificationWithName:object: 或者 notificationWithName:object:u ...

  5. NSNotificationCenter基础知识

    NSNotificationCenter基础知识   Notification的工作机制 1.对应用程序中其他地方发生的事件(比如增加一条数据库记录)感兴趣的对象,会向通告中心(Notificatio ...

  6. Juno 版 Keystone 主配置文件 keystone.conf 详解

    本文全面解读Icehouse发行版keystone的配置文件keystone.conf,由于从keystone提供的服务或依赖的基础设施角度入手,因此[DEFAULT]部分可能被拆分到很多子块中. 关 ...

  7. POCO库——Foundation组件概述

    Foundation组件作为POCO库的基础组件,主要包含了核心Core.缓存Cache.加解密Crypt.日期时间DateTime.动态类型Dynamic.事件events.文件系统Filesyst ...

  8. iOS 底层框架的浅析

    1.简介 IOS是由苹果公司为iPhone.iPod touch和iPad等设备开发的操作系统. 2.知识点 iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设 ...

  9. C++基础知识(4)---例外、异常处理

    对Java熟悉的朋友们都很清楚,java中的异常处理机制是非常完善的.并且java强制使用异常处理,用户必须对有可能出现异常的情况进行处理. 在C++中并没有强制用户使用异常处理,但是使用异常处理将会 ...

随机推荐

  1. ASP.NET 5是如何通过XRE实现跨平台的

    挡不住的好奇心:ASP.NET 5是如何通过XRE实现跨平台的   .NET程序员也有自己的幸福,.NET的跨平台是一种幸福,.NET的开源也是一种幸福,而更幸福的是可以通过开源的.NET了解.NET ...

  2. MAC中在eclipse luna上搭建移动平台自动化测试框架(UIAutomator/Appium/Robotium/MonkeyRunner)关键点记录

    这几天因为原来在用的hp laptop的电池坏掉了,机器一不小心就断电,所以只能花时间在自己的macbook pro上重新搭建整套环境,大家都知道搭建环境是个很琐碎需要耐心的事情,特别是当你搭建的安卓 ...

  3. Mysql C语言API编程入门讲解

    原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程.   ...

  4. 快速构建Windows 8风格应用35-触控输入

    原文:快速构建Windows 8风格应用35-触控输入 引用 Windows 8设备通常具有多点触摸屏,用户可以同时使用多个手指来进行不同的输入交互,如点击.拖动或收缩等手势操作.另外Windows ...

  5. [ext/iconv/iconv.lo] Error 1

    办法1: wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz tar -zxvf libiconv-1.13.1.tar.g ...

  6. 我的Android 4 学习系列之文件、保存状态和首选项

    目录 使用Shared Preference 保留简单的应用程序数据 保存回话间的Activity实例数据 管理应用程序首选项和创建Preference Screen 保存并加载文件以及管理本地文件系 ...

  7. 10.读google测试之道有感

    (一)读google测试之道有感.  

  8. jsp解决kindeditor在线编辑器struts图片上传问题

    1.下载 官网下载ckeditor,解压后去掉不需要的部分,仅需保留plugin,lang,theme文件夹,这三个文件夹中用不到的东西可以删除, 比如lang文件下存放所有语言文件js,仅仅 保留e ...

  9. JavaScript闭包小窥

    众所周知,JavaScript没有块级作用域,只有函数作用域.那就意味着定义在函数中的参数和变量在函数外部是不可见的,而在一个函数内部任何位置定义的变量,在该函数内部任何地方都可见.这带来的好处是内部 ...

  10. OSGi.NET 学习笔记

    OSGi.NET 学习笔记 [目录]   持续更新和调整中,本人学习笔记,非官方文档,难免疏漏,仅供参考. OSGi.NET SDK下载地址. 前言及环境准备 模块化和插件化 概念 实例 小结 面向服 ...