Notification(一)系统通知的监听移除

本文详细解释了iOS7中Notification通知机制的工作原理,包括如何获取通知中心共享实例、如何收听系统广播、如何关闭广播以及不安全保留指针的原因。同时,文章还提供了如何在使用数据库构建更复杂模型时利用广播站机制来监听模型变化的指导,并强调了在MVC离开屏幕后及时移除自己的重要性。

对象间的通信以一种盲目结构进行,也就是MVC的广播站机制,在iOS7里叫做Notification通知

  1. 获取通知中心共享实例: [NSNotificationCenter defaultCenter]

  2. 收听系统广播:addObserver;

  3. 关闭广播:removeObserver(很重要)

    [center removeObserver:self];

    or

    [center removeObserver:self name:UIContentSizeCategoryDidChangeNotification object:nil];
    • 如果不关闭广播,通知中心始终用一个指针指向你,叫做Unsafe retained不安全保留。指针类型不是强或弱而是不安全保留类型。不安全保留类型指的是如果没有调用它就离开了堆,通知中心可能会试着给你发送一个通知,然后应用就崩了。
    • 使用不安全保留指针的原因:为了向后兼容,这里实际上应该是弱类型,如果是弱指针,你离开了堆,通知中心会设置为nil,绝不会再向你发送任何消息了。将指针自动设为nil的这种弱指针机制是iOS6和iOS7中特有的。如果运行在iOS5上就不会起作用,我相信最终他们也许会将它们设为弱类型。
      *总之,结束收听广播之后,要移除自己。通常情况下,在你的MVC离开屏幕后,就要移除自己。通常只有在MVC处于激活状态出现在屏幕上的时候,你才会关注广播消息。
  4. dealloc: 会在你的对象将要离开堆前被调用,所有属性都为nil,几乎已经不再是一个对象的时候 调用这个方法。是最后的关联。所以也可以在这里解决不安全保留指针的问题。但是不建议使用

  5. 使用数据库构建更复杂模型的时候,介绍如何使用广播站机制来监听模型的变化(后面介绍)

eg.收听广播
 - (void)addObserver:(id)observer // 想要收听广播的对象(self当前控制器)
            <!--当广播上出现内容时会调用它-->
            selector:(SEL)methodToInvokeIfSomethingHappens
                <!--name是广播站的名称-->
                name:(NSString *)name 
                <!--你是否只想收听某个特定对象发出的广播(nil表示频率上任何广播)-->
                object:(id)sender;
eg.出现广播调用的方法
- (void)methodToInvokeIfSomethingHappens:(NSNotification *)notification
{
    <!--广播站的名字,和上面的参数一样-->
    notification.name
    <!--object 就是向你发送这个通知的对象-->
    notification.object 
    <!--userInfo是取决于广播站发出的信息-->
    notification.userInfo // notification-specific information about what happened
}
ps:userInfo你想知道是什么,可以用isKindOfClass或者respondsToSelector等来使用它
eg.dealloc
<!--注意:该方法里不能访问属性,因为此时属性已经从堆中移除-->
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

转载于:https://www.cnblogs.com/coco-bao9107/p/4249705.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值