测试Apple LLVM中所引入的Blocks机制是否具有闭包特性
2012-07-19 17:59
405 查看
Apple从OS X Snow Leopard开始(OS X 10.6)以及iOS 4.0开始,在其编译器内引入了Blocks语法特性,使其在C++11标准发布之前就能有Lambda表达式可用了,呵呵~但是其是否是一个闭包(Closure)呢?我们不妨可以测试一下:
以上代码基于OS X Lion,64位应用。 我们可以通过上述输出得知,第一次调用block之前,a的值为0,b为200,b不受MyTest后面赋值的影响,而只是将定义此Block之前的值传给它。而a的变动是受到影响的。因此第一次调用block之后,a变为300,输出500;而第二次调用Block之后,a变为了600,输出800。
因此,Objective-C里的Block满足闭包的定义。但是这里有一个注意点——Blocks默认是分配在栈上的,因此如果要作为返回值返回或作为函数参数,则必须用Block_copy来进行复制。使用结束后必须用Block_release来进行释放。
#import <Foundation/Foundation.h> static void __attribute__((noinline)) (^MyTest(void))(void) { __block int a = 100; int b = 200; NSLog(@"address of a is: 0x%.16lX", (unsigned long)&a); NSLog(@"address of b is: 0x%.16lX", (unsigned long)&b); void (^block)(void) = ^void(void){ a += 300; NSLog(@"The value is: %d", a + b); NSLog(@"address of a is: 0x%.16lX", (unsigned long)&a); NSLog(@"address of b is: 0x%.16lX", (unsigned long)&b); }; a = 0; b = 0; return Block_copy(block); } int main (int argc, const char * argv[]) { @autoreleasepool { // insert code here... void (^block)(void) = MyTest(); block(); // Disrupt the stack space NSLog(@"int = %d, double = %f, long long = %lld", 100, 300.057, 12345677654321LL); block(); Block_release(block); } return 0; }
以上代码基于OS X Lion,64位应用。 我们可以通过上述输出得知,第一次调用block之前,a的值为0,b为200,b不受MyTest后面赋值的影响,而只是将定义此Block之前的值传给它。而a的变动是受到影响的。因此第一次调用block之后,a变为300,输出500;而第二次调用Block之后,a变为了600,输出800。
因此,Objective-C里的Block满足闭包的定义。但是这里有一个注意点——Blocks默认是分配在栈上的,因此如果要作为返回值返回或作为函数参数,则必须用Block_copy来进行复制。使用结束后必须用Block_release来进行释放。
相关文章推荐
- 测试C++2011中的Lambda Expression是否具有闭包特性
- Java 10 新特性解密,引入类型推断机制,将于 2018 年 3 月 20 日发布
- 基于特性和反射机制的通用持久化类的引入
- Java 10 新特性解密,引入类型推断机制
- 谷歌发布音乐商店,具有社交特性和独立艺人中心的功能
- 用redis来实现具有ack机制的消息队列
- 架构大多要具有的特性
- Servlet3.0引入的新特性
- shell判断文件,目录是否存在或者具有权限
- 通过宏定义判断是否引入的是framework,反之则使用双引号,实用!
- 引入个贷评分卡机制,降低贷款风险(转)
- Cisco 交换机STP增强特性与环路保护机制
- 网站的三种黏度是否具有实践基础?
- vc判断当前用户是否具有administrator 权限代码
- appendTo(),prependTo(),insertBefore(),insertAfter()具有破坏性操作特性
- magento的rewrite机制和OOP的隐藏特性
- Redis高级实用特性(持久化机制、发布订阅消息、虚拟内存的使用)
- 【前端盲点】DOM事件流论证CSS盒模型是否具有厚度
- PgSQL · 特性分析 · full page write 机制
- 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter