转载请注明来源,谢谢——by Guava
Notification 既iOS中的“通知”(广播站)机制可以用来监听系统、模型的变化。
接收端:
通过
[NSNotificationCenter defaultCenter]
获得一个共享实例,就用这个对象来接收广播。
收听广播的方法是,向对象发送消息:
- (void)addObserver:(id)observer // you (the object to get notified) 收听广播的对象,对一般的controller来说是self。 selector:(SEL)aSelector // a mothod inside of the observer . 收听的对象中的某个方法。当广播出现时调用这个方法。 name:(nullable NSString *)aName //name of station. object:(nullable id)anObject;// whose changes you‘re interested in (nil is anyone‘s) 这个选项是nil的时候,可以收听来自任何对象的广播,当有值的时候,只收听来自该对象的广播。一般来说,设置成nil。
接下来是,我们有可能感兴趣(真正感兴趣的往往不是值的传递,而是是否发生了广播)的地方,是广播中传递了什么值,或者说,怎么获得广播中传递的值,以下是如果出现广播时,被调用到的方法:
- (void)aSelector:(NSNotification *) notification//这个方法的名字,应该和上面消息中传入的selector 的名字的一样的。 { notification.name; //the name passed about. 广播站的名称,和上面消息中传递的name的值是一样的。 notification.object; //the object sending you notification. 发送广播的对象,对应着上面的sender。 notification.userInfo; //notification-specific information about what happened. 包含的内容取决于发送广播的对象在里面存了什么内容 }
notification.userInfo实际上是一个NSDictionary,取数据的时候,还是需要用[notification.userInfo objectForKey:keyName]来取的。
如果不知道里面放着什么(也许是一个id类),也许会需要isKindOfClass或者respondsToSelector来使用它。
接收方最后一步处理,是关于把自己移除出广播机制的问题。在比较早先的版本,指向observer的指针是一个不安全保留型(unsafe retain),详情可见
http://study.163.com/plan/planLearn.htm?id=1533019#/learn/resVideo?lessonId=263037
这个视频的57--60分钟。
或者文字版的:
http://www.cnblogs.com/coco-bao9107/p/4249705.html
然而这个指针的问题在现在(2015.10)已经得到了解决(亲测)。(如果有空的话后续会上传githu,届时更新链接)。
至于解决的方式,应该是依照白胡子老爷爷的想法,将该指针变成了一个weak的指针(个人推测)。
测试的结果是,当页面从堆里面释放之后,发送广播,没有反应,应用也没有崩溃。这显然是一个大家都想看到的结果(偷懒的没有写remove也不会造成应用崩溃了)。
Notifications:关于MVC模型中的'radio station'