• Blocks的实现


    相关结构体与函数

    __block_impl

    存储block对应类型信息(属于哪个Block大类,以及对应的回调函数指针FuncPtr

    struct __block_impl {
      void *isa;
      int Flags;
      int Reserved;
      void *FuncPtr;
    };
    

    struct __xxx_block_desc_xxxx

    描述针对某个特定的block信息

    __xxx_block_impl_xxxx

    • 每一个block编译以后对应的结构体
    • 构造函数用于初始化impl和Desc
    struct __main_block_impl_0 {
    struct __block_impl impl;
    struct __main_block_desc_0* Desc;
    __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, const char *_text, int flags=0) : text(_text) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
      }
    };
    

    __xxx_block_func_xx

    根据block中的语句生成的函数(该函数将会被回调)

    static void __xxx_block_func_xx(struct __xxx_block_impl_x *__cself) {
    //.....
        }
    

    Blocks的实现方式

    • 每个Block构造一个结构体,用于存储:
      • Block的基本信息
      • 捕获的局部变量
      • 回调的函数
    • 回调函数统一化,第一个参数均为block对应的__xxx_block_impl_xxxx结构体__cself,后面为block的形参列表
    • 回调:通过调用__xxx_block_impl_xxxx的FuncPtr实现

    Blocks与NS3中的Callback实现

    NS3中的Callback实现

    • 定义基类CallbackImplBase以及模板类CallbackImpl
    • 对模板类CallbackImpl进行半特化,生成派生自CallbackImplBase的模板类,定义()函数

      • CallbackImpl第一个参数为回调返回值,后面为回调形参表
      • 不同的特化对应于回调函数的不同输入参数
      • 只把()函数定义成纯虚函数,回调通过CallbackImpl某个子类覆写的()实现
    • 模板类FunctorCallbackImpl派生自模板类CallbackImpl

      • 包含成员变量T m_functor,存储需要回调的函数(非类成员函数)
      • ()通过m_functor (参数列表)实现
    • 模板类MemPtrCallbackImpl派生自模板类CallbackImpl

      • 包含成员变量OBJ_PTR constm_objPtr;MEM_PTR m_memPtr;
      • ()通过m_objPtr)).*m_memPtr(参数列表)实现
    • 定义CallbackBase封装CallbackImpl,根据用户创建callBack时传入的不同参数构建不同的CallbackImpl子类

      比较

    • 二者都是把需要回调的函数指针,以及相关的变量存储在一个结构中

    • 回调执行的时候调用类对象/结构体的成员函数

    • NS3基于C++,运用了模板以及继承关系,相对感觉更复杂

  • 相关阅读:
    RegExp正则表达式心得 1 -分解MIME格式
    转载:ASP.Net性能优化(作者:刘鉴平)
    asp.Net中的多文件上传[载]
    我做的程序
    C#代码执行者1.0
    wordwrap,wordbreak,whitespace,textoverflow的区别和用法[转]
    SQL里面Case的用法
    richTextBox中插入图片的方法
    关于CodeDom的测试
    关系数据库的索引技术
  • 原文地址:https://www.cnblogs.com/rainySue/p/Blocks-de-shi-xian.html
Copyright © 2020-2023  润新知