块是对C语言的一种扩展,它并未作为标准ANSI C所定义的部分,而是由Apple公司添加到语言中的。
示例
#import <Foundation/Foundation.h>
// 块能够定义为全局的或者局部的
void (^calculateTriangularNumber) (int) =
^(int n) {
int i, triangularNumber = 0;
for (i = 1; i <= n; ++i)
triangularNumber += i;
NSLog(@"Triangular number %i is %i", n, triangularNumber);
};
// 计算两个数的最大公约数
int (^gcd) (int, int) =
^(int u, int v) {
int temp;
while ( v != 0 )
{
temp = u % v;
u = v;
v = temp;
}
return u;
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Objective-C中的块类似于C#中的匿名函数
// 等号左边表示printMessage指向一个没有参数和返回值的块指针。
void (^printMessage) (void) =
^(void) {
NSLog(@"Programming is fun.");
};
printMessage();
calculateTriangularNumber(10);
calculateTriangularNumber(20);
calculateTriangularNumber(50);
// 块可以访问在其范围内定义的变量。变量的值同时作为块中定义的值。
int foo = 10;
// 插入块修改器 __block
__block int moo = 10;
void (^printFoo) (void) =
^(void) {
NSLog(@"foo = %i", foo);
NSLog(@"moo = %i", moo);
// 不可以在块内部修改已经编译过的外部变量值
//foo = 20; // ** 该行会产生编译错误
moo = 20; // 因为外部变量moo用了__block关键字,所以块内部可以修改其值
};
foo = 15;
moo = 15;
printFoo();
}
return 0;
}