NSNotification的使用


什么是通知?

通知可以看成是一种模式,要了解通知,首先得了解通知的三个要素

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(doSomeThing:) name:@"notification" object:nil];
这句代码用来给我们注册通知中心

(1)observer.观察者,是用来设置监听通知的对象,这个observer可以添加多个,可以在不同位置处添加.

(2)doSomeThing.是指的在监听者在接收到这个通知后需要做什么事情.

(3)name.这个名称是用来进行辨别通知的唯一标识,编译器也是通过这个来匹配每一个特定的通知的.

(4)object.这个指的是接收者对象,当我们设置为nil的时候,那么默认的就是所有所有名字为notification的通知都接收,不论发送者是谁.


注意:addObserver:selector:name:object:不仅指定一个观察者,指定通知中心发送给观察者的消息,还有接收通知的名字,以及指定的对象。一般   来说不需要指定name和object,但如果仅仅指定了一个object,观察者将收到该对象的所有通知。例如将上面的代码中name改为nil,那么观察者将接收到object对象的所有消息,但是确定不了接收这些消息的顺序。如果指指定一个通知名称,观察者将收到它每次发出的通知。例如,上面的代码中object为nil,那么客户对象(self)将收到任何对象发出NSWindowDidBecomeMainNotification通知。如果既没有指定指定object,也没有指定name,那么该观察者将收到所有对象的所有消息。

通知有什么用?

    在两个object之间传递信息最标准的方法是传递消息 – 一个object调用另外一个object的方法. 但是, 传递的消息这种方法要求发送消息的object知道消息的接收者和它能接收的消息类型. 这将会把两个object紧密的绑定起来 – 最值得注意的是这会让两个本来独立的子系统耦合在一起. 为了解决这些问题, 广播模型被提了出来. Object只是负责发送notification, 而NSNotificationCenter将负责把这个notification转发给所有相关的object.

一个NSNotification(在这片文章里面简称notification)包含一个name, 一个object和一个可选的dictionary. Name是notification的标识. Object包含notification发送者想要发送的任意类型的object(一般来说就是发送这个notification的object本身). Dictionary用来保存其他相关的东西(如果有的话).

任意object都可以发送notification. 任意object都可以在notification center注册以便在某个事件发生的时候能够得到通知. Notification center负责把接受的notification发送给所有注册过的消息接收者. 发送notification的object, notification里面包含的object和接收这个notification的object可以是同一个object, 也可以是三个不同的object. 发送notification的object不需要知道关于接受者的任何信息. 但是, 接受者至少需要知道notification的name和其所包含dictionary的key(如果有的话).

通知的使用步骤?

通知使用起来灰常的简单:

1、定义通知:

[[NSNotificationCenter defaultCenter] addObserver: self							 selector: @selector(callBack)							     name: @"back"							    object: nil];

2、定义通知中使用的方法:

- (void)callBack{	NSLog(@"i am back.");}

3、调用通知:

- (void)getIT{	NSLog(@"get it.");	//发出通知	[[NSNotificationCenter defaultCenter] postNotificationName:@"back" object:self];}


通知与代理的区别?

就使用上看, notification系统和delegate很像, 但是他们有以下不同:

*Notification的接受者可以是多个object. 但是delegate object只能有一个. 这就阻止了返回值.
*一个object可以从notification center接受它想要的任意数量个notification, 而delegate只能接受预先定义好的delegate方法.
*发送notification的object完全不知到接受者是否存在.


根据消息的原理,消息必须释放?

appTest[64158:fe03] -[UITableViewCell atestFun:]: unrecognized selector sent to instance 0x6bceb20

2012-06-08 17:09:14.813 appTest[64158:fe03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCell atestFun:]: unrecognized selector sent to instance 0x6bceb20'

*** Call stack at first throw:

(

0   CoreFoundation                      0x028bcbe9 __exceptionPreprocess + 185

1   libobjc.A.dylib                     0x02a115c2 objc_exception_throw + 47

2   CoreFoundation                      0x028be6fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187

3   CoreFoundation                      0x0282e366 ___forwarding___ + 966

4   CoreFoundation                      0x0282df22 _CF_forwarding_prep_0 + 50

5   Foundation                          0x00d996c1 _nsnote_callback + 145

6   CoreFoundation                      0x02894f99 __CFXNotificationPost_old + 745

7   CoreFoundation                      0x0281433a _CFXNotificationPostNotification + 186

8   Foundation                          0x00d8f266 -[NSNotificationCenter postNotificationName:object:userInfo:] + 134

9   Foundation                          0x00d9b5a9 -[NSNotificationCenter postNotificationName:object:] + 56



2012-06-09 10:14:39.823 appTest[65900:fe03] -[NSCFNumber atestFun:]: unrecognized selector sent to instance 0x6e639a0

2012-06-09 10:14:39.928 appTest[65900:fe03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFNumber atestFun:]: unrecognized selector sent to instance 0x6e639a0'

*** Call stack at first throw:

典型的野指针问题


// remove

[[NSNotificationCenterdefaultCenter]removeObserver:selfname:ANOTIFNAMEobject:nil];



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值