什么是通知?
通知可以看成是一种模式,要了解通知,首先得了解通知的三个要素
[[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];