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++,运用了模板以及继承关系,相对感觉更复杂
Blocks的实现的更多相关文章
- 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM
刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- 开发该选择Blocks还是Delegates
前文:网络上找了很多关于delegation和block的使用场景,发现没有很满意的解释,后来无意中在stablekernel找到了这篇文章,文中作者不仅仅是给出了解决方案,更值得我们深思的是作者独特 ...
- poj 1390 Blocks
poj 1390 Blocks 题意 一排带有颜色的砖块,每一个可以消除相同颜色的砖块,,每一次可以到块数k的平方分数.问怎么消能使分数最大.. 题解 此题在徐源盛<对一类动态规划问题的研究&g ...
- Java 同步代码块 - Synchronized Blocks
java锁实现原理: http://blog.csdn.net/endlu/article/details/51249156 The synchronized keyword can be used ...
- 区块 Blocks
Structure / Blocks / Demonstrate block regions
- 使用Code::blocks在windows下写网络程序
使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...
- Code::Blocks配置GTK+2和GTK+3
Code::Blocks配置GTK+2和GTK+3 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根 ...
- [翻译]理解Ruby中的blocks,Procs和lambda
原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...
- Java Synchronized Blocks
From http://tutorials.jenkov.com/java-concurrency/synchronized.html By Jakob Jenkov A Java synchro ...
随机推荐
- 以Unix之名
即便有了MBP,有时,还是想把MBP装上一个Linux发行版,因为习惯了Linux下的折腾. 但每次想要动手安装时,都会告诉自己,MacOS是很纯正的Unix系统,这样,内心的冲动就可以再多压一压. ...
- 解决WindowsServer 2008 R2 未注册版一个小时自动强制关机
仅用来学习交流,请大家购买正版,尊重正版版权. 安装了win2008R2,试了很多激活方法,终于激活后,不知道什么原因,过了一段时间后,每隔一段时间就自动关机,查了一下,发现是 wlms.exe在作祟 ...
- struts原理
Struts是一个开源的web框架. 为什么会有struts? 因为我们对mvc理解的不同,可能造成不同公司写程序的时候,规范不统一,这样不利于程序的维护和扩展,所以我们有必要用一个统一的规范来开发项 ...
- 左求值表达式,堆栈,调试陷阱与ORM查询语言的设计
1,表达式的求值顺序与堆栈结构 “表达式” 是程序语言一个很重要的术语,也是大家天天写的程序中很常见的东西,但是表达式的求值顺序一定是从左到右么? C/C++语言中没有明确规定表达式的运算顺序(从左到 ...
- 【转】推荐介绍几款小巧的Web Server程序
原博地址:http://blog.csdn.net/heiyeshuwu/article/details/1753900 偶然看到几个小巧有趣的Web Server程序,觉得有必要拿来分享一下,让大家 ...
- C# 泛型的协变和逆变
1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量.协变和逆变是两个相互对立的概念: 如 ...
- css知多少(7)——盒子模型
1. 引言 从这一节开始,我们就进入本系列的第三部分——css呈现.本部分将描述css在页面的几种布局和呈现的特性.包括两类:文字.块. 第一类——文字.这部分相对比较简单一些,例如设置字号.字体.颜 ...
- At.js – 用于 Web 应用程序的自动完成库
At.js 是一个自动完成库,用来实现自动完成提示,表情等,就像你在 Github 或 Twitter 上看到的一样.它支持 HTML5 contentEditable 元素.你可以听任何字符,而不仅 ...
- go语言 类型:数组
在go语言中数组array是一组特定长度的有序的元素集合. go的数组类型由两部分组成——类型和长度,二者缺一不可.数组本来就是一块存储相同类型元素的连续内存空间,因此决定一个数组的类型,必然需要决定 ...
- .net MVC 连接数据本地数据库三种方法
<appSettings> <add key="webpages:Version" value="2.0.0.0" /> <add ...