1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
block研究

函数指针的声明方法为: 函数类型 (标志符指针变量名) (形参列表); 注1:“函数类型”说明函数的返回类型,“(标志符指针变量名 )”中的括号不能省,若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如: int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。 * 可见函数的命名规则为:__{$Scope}_block_func_{$index}。 其中{$Scope}为block所在函数,如果{$Scope}为全局就取block本身的名称;{$index}表示该block在{$Scope}作用域内出现的顺序(第几个block)。 * Clang是一个C语言、C++、Objective C、Objective C++语言的轻量级编译器。源代码发布于BSD协议下。 2013年4月,Clang已经全面支持C++11标准,并开始实现C++1y特性(也就是C++14,这是C++的下一个小更新版本)。Clang将支持其普通lambdas、返回类型的简化处理以及更好的处理constexpr关键字。[1] Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective C/Objective C++编译器,其目标(之一)就是超越GCC。 终端用户特色: 快速编译和较少内存占用[2];有诊断功能;兼容GCC; 实用工具和应用: 基础架构模块库;可满足多样的客户需求(代码重构,静态分析,代码生成,等);允许集成到各种IDE中;使用LLVMBSD协议; 内部设计与实现: 一个简单的可移植的代码库;一个为C、Objective C、C++、Objective C++设计的通用的语法解析器;与C/C++/Objective C及它们的衍生语言具有高度一致性; * 第一个成员isa指针用来表示该结构体的类型,使其仍然处于Cocoa的对象体系中,类似Python对象系统中的PyObject。 第二、三个成员是标志位和保留位。 isa指针,所有对象都有该指针,用于实现对象相关的功能。 flags,用于按bit位表示一些block的附加信息,本文后面介绍block copy的实现代码可以看到对该变量的使用。 reserved,保留变量。 invoke,函数指针,指向具体的block实现的函数调用地址。 descriptor, 表示该block的附加描述信息,主要是size大小,以及copy和dispose函数的指针。 variables,capture过来的变量,block能够访问它外部的局部变量,就是因为将这些变量(或变量的地址)复制到了结构体中。 * * * Clang是一个C语言、C++、Objective C、Objective C++语言的轻量级编译器。源代码发布于BSD协议下。 2013年4月,Clang已经全面支持C++11标准,并开始实现C++1y特性(也就是C++14,这是C++的下一个小更新版本)。Clang将支持其普通lambdas、返回类型的简化处理以及更好的处理constexpr关键字。[1] Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective C/Objective C++编译器,其目标(之一)就是超越GCC。 终端用户特色: 快速编译和较少内存占用[2];有诊断功能;兼容GCC; 实用工具和应用: 基础架构模块库;可满足多样的客户需求(代码重构,静态分析,代码生成,等);允许集成到各种IDE中;使用LLVMBSD协议; 内部设计与实现: 一个简单的可移植的代码库;一个为C、Objective C、C++、Objective C++设计的通用的语法解析器;与C/C++/Objective C及它们的衍生语言具有高度一致性; * * 本例中,isa指向_NSConcreteStackBlock,说明这是一个分配在栈上的实例。 main_block_impl_0 中增加了一个变量a,在block中引用的变量a实际是在申明block时, 被复制到main_block_impl_0结构体中的那个变量a。因为这样,我们就能理解,在block内部修改变量a的内容,不会影响外部的实际变量a。 main_block_impl_0 中由于增加了一个变量a,所以结构体的大小变大

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档