`
lizhuang
  • 浏览: 903958 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

NSNotificationCenter消息注册与撤销

 
阅读更多
摘要: 苹果的消息机制是个非常好用的东西,当需要在类的各个实例之间传递消息或者写一些事件驱动的程序时,绝对是个不错的工具。但是使用时一不小心就会造成引用已经被dealloc的对象的错误,引起程序崩溃。于是,在合适的 ...
苹果的消息机制是个非常好用的东西,当需要在类的各个实例之间传递消息或者写一些事件驱动的程序时,绝对是个不错的工具。但是使用时一不小心就会造成引用已经被dealloc的对象的错误,引起程序崩溃。于是,在合适的时机addobserver和removeobserver就是个很关键的事情。下面,分几种情况来阐述一下自己的一点想法。
一,使用defaultcenter。
简单的情况下,若自己没有太多的消息需要注册和处理,直接使用[NSNotificationCenter defaultCenter]来调用默认的消息中心就够用了。如果,有一些特殊的要求那么,就需要试一下一个继承自NSnotificationcenter的子类。
二,在视图显示的时候接受消息。
有些时候,我们需要在一个已经显示在主界面上的ViewController上做一点动作,比如当一个同步过程完成后,把同步的结果显示在界面上。但是,如果这个ViewController没有显示在主界面上的话,它就不关心同步结果是什么样子了。所以这个时候,我们可以在viewwillappear或者viewdidapper中addobserver添加消息监听。然后在viewwilldisappear和viewDidDisappear中removeObserver把消息注销掉。
三,在类的实例存在的时候接受消息。
很多时候,我们需要让一些类的实例只要在内存中,就要接受消息,处理一些事情。比如我们有一个管理同步的类SyncManager,这个类使用了单例模式,从它alloc init之后就需要一些监听同步的状态,并作出处理。这个时候,我们就需要在重写init函数,在其中注册消息。
- (id) init
{
    self = [super init];
    if(self)
    {
         [[NSNotificationCenter defaultCenter] addObserver........]
     }
     return self;
}
然后在dealloc中注销
- (void) dealloc
{
    ......
    [ [NSNotificationCenter defaultCenter] removeObserver.......]
    [super dealloc]
}
四,在viewController存在的时候接受消息
很多时候,我们会与ViewController打交道,甚至有些时候我们希望只要ViewController在内存中就监听一些消息作出一些动作。刚开始的时候,我想实现这个功能,我是这么写的
- (void) viewDidLoad
{
    ......
    [[NSNotificationCenter defaultCenter] addObserver........]
    .....
}
- (void) viewDidUnload
{
    ......
    [ [NSNotificationCenter defaultCenter] removeObserver.......]
    ......
}
但是,在使用的过程中我发现viewDidLoad和Viewdidunload并不是成对出现的,只有在内存紧张和一些特定的情况下系统才会调用视图的ViewDidUnload来卸载视图。而ViewDIdload每一次加载都会执行。
也就是说removeObserver并不一定能够被执行到,这就留下隐患。当视图被dealloc之后,还在监听消息。最终会造成程序的崩溃。而且有些时候如果没有在unload中removeOberver还会造成多次注册同一个消息。造成同一个函数执行多次。引起不必要的麻烦。
然后,在使用过程中,经过多次试验我发现,使用init注册消息并在dealloc注销消息最为合适,就像第三条说的那样。在这里值得提醒的一点是苹果的官方文档上说:
The notification center does not retain its observers, therefore, you must ensure that you unregister observers (using removeObserver: or removeObserver:name:object:) before they are deallocated. (If you don't, you will generate a runtime error if the center sends a message to a freed object.)
意思是NotificationCenter并不会对Observer进行retain操作。因为就没有必要对observer做多余的release操作,而且,每一次注册,必须对应一次注销,不然,程序死翘翘的事情就会来了。

如果不在dealloc中使用remove,系统会在下次POSTNotification时出现EXC_BAD_ACCESS错误。
分享到:
评论

相关推荐

    NSNotificationCenter 的使用

    1. `name`: 通知的名称,与注册时保持一致。 2. `object`: 发送通知的对象,可选,通常用于指定发送通知的上下文。 3. `userInfo`: 一个字典,可以携带额外的信息,观察者可以通过这个字典获取更多数据。 **移除...

    ios 消息NSNotificationCenter多页面传参

    `NSNotificationCenter`是Foundation框架的一部分,它提供了一个观察者模式的实现,使得一个对象(称为发布者)可以在任何时候发送消息到所有注册了该消息的接收者(称为观察者)。在这个案例中,`A`页面的`N+1`个...

    网络连接 与 NSNotificationCenter

    标题 "网络连接 与 NSNotificationCenter" 涉及到的是iOS开发中的两个核心概念:网络状态监测和应用程序的通知中心机制。这篇博文可能讨论了如何利用苹果的 Reachability 框架来检测设备的网络状态,并结合 ...

    ios-对NSNotificationCenter的封装.zip

    在原始的NSNotification使用中,我们需要调用`-[NSNotificationCenter addObserver:selector:name:object:]`方法来注册一个观察者。这个方法接收四个参数:观察者对象、选择器(当通知被发送时执行的方法)、通知...

    ios demo,NSNotificationCenter,app进入后台时的调用和就、进入前台时的调用

    `NSNotificationCenter`是Apple提供的一个通知中心,用于对象间的消息传递,无需直接耦合。 首先,我们要了解iOS应用的生命周期。在iOS中,应用有五种主要的状态:初始化、活动、后台、挂起和终止。当用户按下Home...

    ios NSNotificationCenter通知的简单使用

    通知类本身比较简单,大概就分为注册通知监听器、发送通知,注销通知监听器三个方法;...//object为接收通知的对象,需要与postNotification的object匹配,否则接收不到通知 - (void)addObserver:(id)observe

    iOS NSNotificationCenter通知中心使用小结

    iOS中的NSNotificationCenter是系统提供的一种消息传递机制,它允许对象发布通知,其他对象可以注册接收这些通知,从而实现不同对象间的数据同步或者事件响应。在iOS开发中,NSNotificationCenter经常与Delegate模式...

    objective-C NSNotificationCenter (通知

    iOS 通知 转发

    SFObservers, NSNotificationCenter和KVO自动删除观察者.zip

    SFObservers, NSNotificationCenter和KVO自动删除观察者 在任何项目中,我不再使用 SFObservers,但仍然会接受请求的请求。命令行目SFObservers是在NSNotificationCenter和KVO中为观察者 Pattern 添加自动删除的类别...

    类似 Observer Pattern 的 NSNotificationCenter (实例)

    `name`参数是之前设置的通知名称,`object`是与通知相关联的对象,如果为nil,则所有注册了该通知的观察者都会收到通知。 3. **通知的生命周期**:通知一旦发布,会传递给所有注册了相应名称的观察者,除非它们被...

    NSNotificationCenter详解

    观察者可以是任何对特定通知感兴趣的对象,它们通过注册到NSNotificationCenter来接收通知。 1. 注册观察者:使用`addObserver(forName:object:queue:using:)`方法。参数包括通知名称、可选的发送者对象、执行回调...

    OC-NSNotificationCenter.异步线程下载图片zip

    它提供了一个发布/订阅模型,允许对象(订阅者)注册接收特定的通知,当其他对象(发布者)发送这些通知时,订阅者会接收到相应的消息。在iOS应用中,我们经常用它来监听各种事件,比如网络状态变化、用户登录登出等...

    iOS基础——通知代理之NSNotificationCenter、Delegate

    当你有一个对象想要向系统中的其他任何对象广播一个消息时,可以使用NSNotificationCenter。发布通知的基本流程包括注册接收者(Observer)来监听特定的通知,发布通知(Post Notification),以及移除不再需要的...

    使用NSNotificationCenter的通知发布及监听DEMO

    本DEMO旨在通过实例来详细介绍如何使用NSNotificationCenter发布通知以及注册为观察者。 首先,理解NSNotification的基本概念: 1. **通知中心(NSNotificationCenter)**:它是整个系统的核心,负责处理通知的发布...

    izevent:NSNotificationCenter的纯替代品

    IZEvent IZEvent是NSNotificationCenter的纯Swift替代方案。 它努力做到简单,安全和简单。 Pro的NSNotificationCenter上: 内存安全:不会发生内存泄漏,也不需要在deinit中删除观察者线程安全:默认情况下将事件...

    FXNotifications, 一个NSNotificationCenter的替代 API.zip

    FXNotifications, 一个NSNotificationCenter的替代 API 命令行目FXNotifications是 NSNotificationCenter的一种类别,提供了基于基于的API,更简单易用,并避免了官方API的不同内存漏洞。有关更多详细信息,请参见...

    AutoRemoveObserverDemo:自动删除NSNotificationCenter观察器的演示

    替换NSNotificationCenter的 addObserver... 方法, 新方法中用一个 Wrapper对象来封装传进来的Observer. 想通过真正的observer被释放时触发wrapper的 realObserver setter方法, 从而移除通知. //Wrapper.h @...

    NSNotificationCenter例子(iPhone源代码)

     一个简单的NSNotificationCenter的使用例子Demo,适合初学者。另外一个简单的UI效果是在tab bar的tab上面加上数字badge。 小编注:感谢开发者@Promise松 分享代码于本站。 Code4App编译测试,适用环境:Xcode ...

Global site tag (gtag.js) - Google Analytics