相关结构体与函数

__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++,运用了模板以及继承关系,相对感觉更复杂

Blocks的实现的更多相关文章

  1. 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM

    刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...

  2. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  3. 开发该选择Blocks还是Delegates

    前文:网络上找了很多关于delegation和block的使用场景,发现没有很满意的解释,后来无意中在stablekernel找到了这篇文章,文中作者不仅仅是给出了解决方案,更值得我们深思的是作者独特 ...

  4. poj 1390 Blocks

    poj 1390 Blocks 题意 一排带有颜色的砖块,每一个可以消除相同颜色的砖块,,每一次可以到块数k的平方分数.问怎么消能使分数最大.. 题解 此题在徐源盛<对一类动态规划问题的研究&g ...

  5. Java 同步代码块 - Synchronized Blocks

    java锁实现原理: http://blog.csdn.net/endlu/article/details/51249156 The synchronized keyword can be used ...

  6. 区块 Blocks

    Structure / Blocks / Demonstrate block regions

  7. 使用Code::blocks在windows下写网络程序

    使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...

  8. Code::Blocks配置GTK+2和GTK+3

    Code::Blocks配置GTK+2和GTK+3 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根 ...

  9. [翻译]理解Ruby中的blocks,Procs和lambda

    原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...

  10. Java Synchronized Blocks

    From http://tutorials.jenkov.com/java-concurrency/synchronized.html By Jakob Jenkov   A Java synchro ...

随机推荐

  1. 如果你恨一个程序员,忽悠他去做iOS开发

    如果你恨一个程序员,忽悠他去做iOS开发.不管他背景是cobel还是 java,送他一本iOS开发的书.这种书最好是国人写的,容易以偏概全一点,相比洋鬼子的书,更容易学到皮毛.这叫舍不得孩子套不着狼, ...

  2. WinForm 容器控件

    容器控件: 布局:2个属性:Anchor:锁定位置Dock:填充位置一般Dock是与容器控件配合使用 Panel:就是一个区域,类似于DIV,可以独立布局,还可以让其它控件及容器在它的内部再次布局 F ...

  3. Mac OS 的一点历史: Mac OS, Mac OSX 与Darwin

    作为收购 NeXT 公司的结果,苹果公司获得了 NeXTSTEP 架构中的 Mach 和 Objective-C 等设计.尽管 NeXTSTEP 本身已经不再发展了,但是其中的组件在 OS X 中获得 ...

  4. SRC单一职责原则

    一.定义 一个类应该只有一个发生变化的原因. 二.为什么要使用SRC 因为每一个职责都是变化的一个轴线.当需求变化时,这种变化就会反映为类的职责的变化.如果一个类承担了多于一个的职责,那么引起它变化的 ...

  5. 介绍开源的.net通信框架NetworkComms框架 源码分析(十九 )ConnectionIncomingData

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  6. JS获取子窗口中返回的数据

    在开发的时候,遇到了这样一个问题,客户填写自己的收货地址,可以新建,但同时也可以选择之前填写的,由于我们的客户本身就是商户,地址繁多,把它之前的地址简单用个下拉框罗列出来显然不合适,并且客户要求能够对 ...

  7. MySQL 语句大全--------添加列,修改列,删除列

    ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table ...

  8. php 设置mssql编码 解决乱码问题 mssql_connect charset Utf8

    当用mssql存储数据采用 nchar 或 nvarchar  存储时 , 由于nchar 或 nvarcha 不支持 UCS-2 ( 即 SQLServer 不会按照 UTF-8 格式存储) 导致P ...

  9. android 查找某个特定文件后缀名

    private void queryFiles(){ String[] projection = new String[] { MediaStore.Files.FileColumns._ID, Me ...

  10. struts—文件的上传和下载

    设计了一个小的案例:上传图片到服务器,上传成功后显示图片列表,然后点击下载上传到服务器的图片. 注意表单的配置属性: <form enctype="multipart/Form-dat ...