结合之前的学习笔记以及參考《Objective-C编程全解(第三版)》,对Objective-C知识点进行梳理总结。

知识点一直在变。仅仅是作为參考。以苹果官方文档为准~


十九、通知-消息发送模式之中的一个


1、几个基本概念

(1)通知:在面向对象的程序中。有时须要将发生的时间通知给多个对象的消息发送模式;

(2)通知中心:期望取得通知的对象预先向通知中心注冊期望取得的通知;

(3)发送:某对象向通知中心发送消息发送请求,仅仅有注冊过该通知单额对象,都可获得通知中心推送的消息;

(4)观察者:消息发送目标,在通知中心注冊的对象(能够有多个)。

(5)多播:某个对象向特定的多个对象发送消息,通知就是多播的一种


2、通知对象:向通知中心发送消息,必要的信息会在NSNotification类实例中集中后发送给通知中心

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
+ (instancetype)notificationWithName:(NSString *)aName
object:(id)anObject
userInfo:(NSDictionary *)aUserInfo;

变量说明:

aName:识别通知的短文本。向NSNotification接口发送例如以下消息可取出名字

anObject:和通知一起发送的附带信息的对象,多为发送通知的对象,也可为nil

userInfo:传递和通知相关的各种信息,也可为nil


3、通知中心NSNotificationCenter

(1)系统有默认的通知中心。一般不用自己创建。

类方法获取

+ (NSNotificationCenter *)defaultCenter;
[NSNotificationCenter defaultCenter];

(2)通知发送

- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSString *)aName object:(id)anObject;
- (void)postNotificationName:(NSString *)aName
object:(id)anObject
userInfo:(NSDictionary *)aUserInfo;

指定通知名、对象和用户字典生成通知。然后发送给接收者的通知中心


(3)观察者注冊

- (void)addObserver:(id)observer
selector:(SEL)aSelector
name:(NSString *)aName
object:(id)anObject;

变量说明:

observer:通知的监听者

aSelector:收到通知后,会调用observer的此方法。

aName:通知名。当不为nil时,仅仅接受特定对象发送的通知;假设未nil表示没有设定的发送源

object:通知的发送者

仅指定特定的多个通知名的通知时,能够将各个通知名分别在通知中心注冊,或者指定通知名为nil使其发送有关全部通知名的消息。并在接收后仅仅处理必要的消息;两者都为nil则能够接收全部关于发送消息的通知(这是书上原话)


(4)删除观察者的注冊

- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer
name:(NSString *)aName
object:(id)anObject;
[NSNotificationCenter defaultCenter] removeObserver:obj];

(5)关于内存管理

(1)在引用计数管理的情况下,通知中心在注冊观察者时,并不retain观察者及发送元对象。因此释放这些对象之前。要确实从通知中心删除相关设置。

否则指向释放对象的指针会变成空指针。(即要remove)

(2)在垃圾回收机制时。通知者和发送源对象会使用弱引用在通知中心注冊。

不管是否注冊,都可能被回收释放。

无需显式删除观察者的注冊;


我个人简单地理解一下。就是以下几句白话~

(1)通知中心有默认的。不要纠结它究竟在哪里,要不要创建。仅仅要抓好发送通知和观察者就能够。

(2)能够有多个观察者。注冊便是。

(3)通知对象能够不用创立,直接发送通知就能够了。

(4)观察者的地方add。remove;

(5)name为nil,能够接受全部发送的通知

这部分的代码样例。请參考下一篇

“通知模式实现两个textField传值及模态视图——iOS开发”

最新文章

  1. win32程序组成
  2. WCF ABC
  3. NetMQ发布订阅C#示例
  4. 夺命雷公狗---Thinkphp----4之数据表的设计
  5. Android 图片选择器
  6. Xmemcached
  7. org.springframework.context.event.AbstractApplicationEventMulticaster
  8. Swift - 后台获取数据(Background Fetch)的实现
  9. JS特效——图片水平滚动
  10. 使用vue实现tab操作
  11. Python tutorial阅读之使用 Python 解释器
  12. TortoiseGit与GIt生成ssh秘钥添加到github账号的简单方法!简单使用
  13. 学习excel的使用技巧二批量复制
  14. DevOps - CI - 持续集成(Continuous Integration)
  15. Solr各个版本重大变化之安装方式【请别违背规律】
  16. Tensorflow 笔记
  17. jQuery项目赋予Router
  18. Dubbo -- 系统学习 笔记 -- 配置参考手册
  19. DIV+CSS如何让文字垂直居中?(转)
  20. AWR报告中Top 10 Foreground Events存在”reliable message”等待事件的处理办法

热门文章

  1. Could not load the FreeMarker template named 'select'
  2. 16.允许重复的multimap
  3. python3.x学习笔记3(基础知识)
  4. 从Chrome源码看audio/video流媒体实现一(转)
  5. 修改route.php文件对ThinkPHP快速注册路由
  6. php计算两个时间相差的天数、小时数、分钟数、秒数
  7. numpy基础篇-简单入门教程1
  8. caioj 1076 动态规划入门(中链式3:最大的算式)
  9. CMSIS-RTOS的使用
  10. Spring-statemachine给end状态设置action