浅谈Blocks

在上次的Snow Leopard tech review摘要中提到,Snow Leopard(实际上是Xcode 3.2附带的编译器)开始支持Blocks。这是一个非常有意思的功能,以前通常只有一些动态语言支持,而现在,C/C++/Objective-C也可以用上这个功能了。 Block, 简单的说,就是一个函数对象,和其它类型的对象一样,你可以创建它,可以赋给一个变量,也可以作为函数的参数来传递。计算机科学中,更常用的名字是”closure”或者”lambda”。先通过一个例子看看什么是Block: void (^hello)(char*); hello = ^(char* str) { NSLog(@”hello %s”, str); }; hello(“robin”); 这段代码申明了一个block变量hello,然后用一个block对象为它赋值,最后调用了这个函数。这是打印出的结果: 2009-09-06 16:36:12.693 blocks[6379:903] hello robin 再看一个例子。玩ruby的都知道each方法,可以很方便的遍历一些数据组合。比如: [1,2,3].each {|x| puts x } 就可以打印出 1 2 3 现在,我们也可以为NSArray加上这样的方法。我为NSArray写了一个Category,加入下面函数的实现: – (void)each:(void (^)(id))block { for (id obj in self) { block(obj); } } 很简单,我们就有了一个属于NSArray的each。看一个调用的例子: 
NSArray * array = Read more about 浅谈Blocks[…]