Objective-C 编程全解-第15章 消息发送模式 上

第15章 消息发送模式 上

运行回路、委托、通知、反应链

15.1 应用和运行回路

15.1.1 运行回路

    应用从操作系统中接受鼠标点击等事件的消息,并将其转到相应的例行程序处理,如此反复,这样的过程被称为运行回路(run loop)或事件循环(event loop)

    运行回路从操作系统(更精确的说是窗口服务器)中接收事件,并根据事件种类和状态来调用相应的例行程序,同时也会忽视那些没必要处理的事件。这些事件的到来非常随机,当应用程序正在处理某个事件消息时,新接收到的消息就不能立即被处理,而有必要放到等待队列中,等到空闲的时候才能被处理。没有消息到来的时候,应用会进入休眠等待的状态。

    从应用程序开发者的角度来说,某个事件触发时,总有一个OC对象接收到该事件消息。因此,开发者只要集中精力实现消息事件的处理方法就可以了。

    因为Cocoa应用本身就有GUI功能,所以一旦开始运行,就一定会产生一个运行回路,他也称为主运行回路。同时,应用的事件处理或资源的管理功能需要一个对象来完成,所以Mac OS X中提供了NSApplication类的实例,iOS中提供了UIApplication类的实例,该实例会根据操作系统发送的事件选择对应的处理对象,并发送相应的消息。应用使用NSRunLoop类来访问运行回路。

在引用计数方式的情况下,主运行回路在启动事件处理方法时会自动生成一个自动释放池。


15.1.2 定时器对象

    定时器的使用必须要有运行回路。在运行回路上注册定时器后,到达规定的时间时,运行回路会调用注册的方法处理。

15.1.3 消息的延迟执行

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

    延迟执行可以实现在设置的时间间隔后执行某种操作。而除此之外,在使消息处理和GUI操作并发执行时,以及消息没有按照预期顺序执行时,通过延迟执行都能有效地解决这些问题。


15.2 委托

    委托时对象之间分担功能并协同处理的一个典型设计模式。在面向对象中,委托一般解释为“某对象接受到不能处理的消息时让其他对象代为处理的一种方式”。

15.2.2 Cocoa环境的委托

    委托有很高的复用性,在作为组件使用的类中十分有效。通过使用委托,可以在不损害原类独立性的同时,给软件增加独立的功能。

15.2.3 委托的设置和协议

    MRC中委托属性一般设置为assign,由于没有保留委托对象,因此解除委托功能时就需要显示设置为其他值或者nil,否则就有造成空指针的危险。

    使用ARC时,委托一般设置为weak。


15.3 通知

15.3.1 通知和通知中心的概念

    某个对象向特定的多个对象发送消息,这样的通信方式称为多播(multicast)。此外向非特定的多个对象发送消息称为广播(broadcast)。

15.3.3 通知中心

(4)删除观察者的注册

作为观察者注册的对象也可以取消注册。

- (void)removeObserver:(id)observer; //删除参数observer为观察者的所有设定。

- (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;//删除对指定的观察者、通知名和发送源的监视设定。参数为nil实则不会被作为条件使用

[[NSNotificationCenter defaultCenter]removeObserver:nil name:nil object:obj];表示删除指定对象obj为发起源的所有设置。


这里需要格外注意对象的内存管理。

    首先,使用引用计数管理的情况下,通知中心在注册观察者时,并不保留(retain)观察者及发送源对象。所以,在释放这些对象之前,要确实从通知中心删除相关设置。否则,指向释放对象的指针将成为野指针。

    使用垃圾回收时,观察者和发送源对象会使用弱引用再通知中心注册。所以,即使这些对象被回收释放。释放的指针也同时被清零,因此无需显示删除观察者的注册。


15.4 反应链

最初被发送消息的对象称为第一反应者(first responder)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值