Objective-C(十九、通知-消息发送模式之一)——iOS开发基础



结合之前的学习笔记以及参考《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开发”

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 06:25:48

Objective-C(十九、通知-消息发送模式之一)——iOS开发基础的相关文章

RabbitMQ--顺序消费模式和迅速消息发送模式

MQ使用过程中,有些业务场景需要我们保证顺序消费,而如果一个Producer,一个Queue,多个Consumer的情况下是无法保证顺序的 举例: 1.业务上产生三条消息,分别是对数据的增加.修改.删除,而如果没有保证顺序消费,结果可能是删除.修改.增加,本来数据最终要删除 .结果变成增加 2.或者是电商平台,先付钱,然后生成订单,然后通知物流(我对电商不怎么熟悉,这只是个例子而已,可能不太恰当),如果顺序改变了, 客户不付钱了,你却通知物流送货了 所以,这些业务场景下,消息的顺序消费很重要 解

云计算设计模式(十九)——运行重构模式

云计算设计模式(十九)——运行重构模式 设计应用程序,使得它可以在不需要重新部署或者重新启动应用程序重新配置.这有助于保持可用性并减少停机时间. 背景和问题 一个主要目的为重要的应用,如商业和企业网站是尽量减少停机时间以及由此引发的中断给客户和用户.但是,有时有必要重新配置应用程序改变特定行为或设置,而在部署和使用.因此,它是用于该应用程序被设计成这样一种方式,以允许在运行时要应用这些配置的变化,并为应用程序,以检测所述变化并且尽快地应用它们的部件的优点. 该种要应用可能被调整记录,以协助与应用

设计模式 ( 十九 ):Strategy策略模式 -- 行为型

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择.这

云计算设计模式(十九)——执行重构模式

云计算设计模式(十九)--执行重构模式 设计应用程序,使得它能够在不须要又一次部署或者又一次启动应用程序又一次配置.这有助于保持可用性并降低停机时间. 背景和问题 一个主要目的为重要的应用.如商业和企业站点是尽量降低停机时间以及由此引发的中断给客户和用户. 可是.有时有必要又一次配置应用程序改变特定行为或设置,而在部署和使用.因此,它是用于该应用程序被设计成这样一种方式,以同意在执行时要应用这些配置的变化,并为应用程序.以检測所述变化而且尽快地应用它们的部件的长处. 该种要应用可能被调整记录,以

设计模式之工厂模式(iOS开发,代码用Objective-C展示)

<大话设计模式>这是一本经典之作,本来我该看<Objective-C编程之道:IOS设计模式解析 >,其实我也是先看的<Objective-C编程之道:IOS设计模式解析 >,但不得不说,其中内容有些深奥,理解起来比较困难.这与我一贯的学习方针不合,我更喜欢一个循序渐进的过程,从认知到实践再到思维上的一个比较深入的学习.然后有朋友向我推荐了<大话设计模式>这本书籍,初看,感觉很是符合我现在这个阶段,在此以前,我所编码中接触的设计模式都是比较简单的,在代码上也

设计模式(十九):备忘录模式

一.定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存的状态 二.实例 2.1 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据. public class Originator { private string state = string.Empty; public string GetState() { return state; } public void SetState(strin

Android开发本地及网络Mp3音乐播放器(十九)通知媒体库更新刚下载的MP3

实现功能: 通知媒体库更新 纠结了几天,百度到一个方法,可以在安卓4.4,通知媒体库更新. 媒体库更新了,重新打开APP,就可以看到新的歌曲,但这样还是不完善. 后续将博文,将实现 下载音乐成功后,通更新媒体库后,更新本地音乐列表. 因为,没有自己的服务器,所以网络音乐所有相关功能(包含搜索音乐.下载音乐.下载歌词)均无法保证时效性,建议,尽快下载和练习:如果你下载时候,已经因为我采集的服务器更改规则,请给我留言,如果可以解决,我将在有空的时候献上新的源码. 截止到目前的源码下载: http:/

第十九节 集群模式内各节点的通信和文件拷贝

scp 用于两台Linux主机之间的通信安装 yum -y install openssh-clients 命令格式: scp file 远程用户名@远程服务器ip:-/ (注意:冒号和目录之间不能有空格,如果拷贝目录需要加-r) scp /etc/profile [email protected]:/etc 文件,把/etc/profile传到[email protected]:/etc scp -r /usr/jdk.1.8 node2:/etc 目录,用户名默认是root,如果是传给roo

Spring.NET教程(十九)整合NHibernate和ASP.NET MVC(基础篇)

今天带给大家的就是期待以久的ASP.net MVC与Spring.NET和NHibernate的组合,视图打造.NET版的SSH(Spring-Struts-Hibernate).是不是听到名字都很兴奋?我认为目前的ASP.NET MVC比Struts在某些功能上要好用的多,而且代码量要少,这就是我一直热衷于ASP.NET MVC的原因. 我们接着昨天的例子学习.昨天我们成功测试了带事务的业务层.接下来就是将业务层的对象注入到Controller中.我们先在Controller中写好要注入的属性