• NSNOTIFICATIONCENTER消息注册与撤销


    苹果的消息机制是个非常好用的东西,当需要在类的各个实例之间传递消息或者写一些事件驱动的程序时,绝对是个不错的工具。但是使用时一不小心就会造成引用已经被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操作,而且,每一次注册,必须对应一次注销,不然,程序死翘翘的事情就会来了。

    C语言

     
    NSNotificationCenter消息注册与撤销
    摘要: 苹果的消息机制是个非常好用的东西,当需要在类的各个实例之间传递消息或者写一些事件驱动的程序时,绝对是个不错的工具。但是使用时一不小心就会造成引用已经被dealloc的对象的错误,引起程序崩溃。于是,在合适的时机addobserver和removeobserver就是个很关键的事情。下面,分几种情况来阐述一下自己的一点想法。一,使用defaultcenter。简单的情况下,若自己没有太多的消息需要注册和处理,直接使用[NSNotificationCenter defaultCenter]来调用默认的消息中心就够用了。如果,有一些特殊的要求那么,就需要试一下一个继承自NSnotificationc阅读全文
    POSTED @ 2012-04-03 23:09 文鬼 阅读(698) | 评论 (0) 编辑
    int long 字节数
    摘要: int long 字节数2008年05月19日 星期一 上午 09:01上次腾讯面试,问我int和long分别几个字节,结果被鄙视了。事过N天,鼓起勇气来好好查了一下,发现学问还是蛮大的。int类型比较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量用__int16 __int32 __int64吧,或者自己typedef int INT32一下。C、C++标准中只规定了某种类型的最小字节数(防止溢出)64位指的是cpu通用寄存器的数据宽度是64位的。找到一个图数据类型名称字节数别名取值范围int*signed,signed int由操作系统决定,即与操作系统的"字长"有关un阅读全文
    POSTED @ 2011-03-18 16:34 文鬼 阅读(86) | 评论 (0) 编辑
    c语言中int型变量的字节数
    摘要: 一个字节包含8位16位机是char:一个字节,占8位int:2个字节,占16位。一个int就是一个机器字。long:4个字节,占32位32位机的字节与位数都是翻倍的而且现在的大部分机器都是32位所以:int:32位short:16位char:8阅读全文
     

    http://www.cnblogs.com/markcxz/tag/Java/

  • 相关阅读:
    如何面试程序员?
    开始做项目
    ===
    依赖注入获得一个对象却想返回不同的值(Error)
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not reread row data for column 4.
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.
    .net 4.5新特性
    有限状态机简单示例
    JavaScript入门经典(第四版)文摘
    小强升职记读后感
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2432383.html
Copyright © 2020-2023  润新知