参考了网上的一些Block的文档,加上自己对Block的使用、理解,对Block做一个简单的分析。
Block是C语言的扩展,像其他语言的闭包一样。简单的可以这么说,Block是带有自动变量(局部变量)的匿名函数。
Block的基本语法
float (^sum)(float, float) = ^(float a, float b){
return a + b;
};
sum(1,2);//求和
Block的常见类型
- _NSConcreteStackBlock(栈)
- _NSConcreteGlobalBlock(全局)
- _NSConcreteMallocBlock(堆)
下面分别介绍这三种类型
- NSStackBlock:位于堆内存,函数返回后Block将无效。对NSStackBlock进行copy操作会生成NSMallocBlock。对NSMallocBlock进行copy操作,会引起引用 计数加1。
//MRC环境下...
int x = 100;
float (^sum) (int a, int b) = ^ float (int a, int b) {
return x +a + b;
};
NSLog(@"%@",sum);
打印结果:
- NSMallocBlock:在Block内操作了外部变量。如果在作用域外部使用的话,ARC环境下,会自动进行copy,将生成的NSStackBlock变为NSMallocBlock。在MRC环境下,需要手动将其copy到堆上。
int x = 10;
float (^sumMalloc)(float, float) = ^(float a, float b){
return a + b + x;
};
NSLog(@"Mallocblock is %@", sumMalloc); //block is <__NSGlobalBlock__: 0x47d0>
NSLog(@"Mallocsum is %f", sumMalloc(1,2)); //block is <__13>
打印结果:
- NSGlobalBlock:在Block内没有引用外部变量或只用到全局变量、静态变量,对NSGlobalBlock的retain、copy、release操作都无效。
float (^sum)(float, float) = ^(float a, float b){
return a + b;
};
NSLog(@"block is %@", sum);
NSLog(@"sum is %f", sum(1,2));
打印结果:
参考这里,理解有不足的地方望指出。