Block是什么?
块(block)是由LLVM提出的类似于lambda表达式的非标准C语言扩展,亦可以应用于Objective-C与C++中。它的语法类似于这些函数中的闭包,即由大括号包括的语句块。block与C/C++中的函数指针相似
Block是在栈上面分配的
Objective-C中的3种Block
1.全局的静态Block:_NSConcreteGlobalBlock,不会访问任何外部变量
2.堆中的Block:_NSConcreteStackBlock,出栈既销毁
3.栈中的Block:_NSConcreteMallocBlock,和OC中对象一样,引用为0既销毁
Block功能?
一个Block是匿名的内联代码体,可以设置参数类型和返回参数类型,
block(库文件有要求)可以在C和C++上使用,但它还是OC对象
通常可以用作回调,例如Nav的Pop方法。
Block的数据结构(内存分布)图
PS:在Objective-C中每个对象都包含了这个isa指针,这个指针很常见,对象,KVO,block都有他
IOS许多地方能见到Block,系统函数中就有不少使用到的
Block简单的使用
下面是个简单的声明
int (^Multiply)(int, int) = ^(int num1, int num2) {
return num1 * num2;
};
int result = Multiply(7, 4); // 返回值 28.这个是最简单的用法
-(void)NSlogHinumbera:(int)a numberb:(int)b Function:(int (^)(int,int))testFunction
{
int t1=5,t2=10;
//由于blocks是有返回值的,我们还可以在下面利用该值继续进行链式操作 这个是第二种使用方法
int sum=testFunction(t1,t2);
sum*=2;
NSLog(@"sum=%d",sum);
}
声明成关键词
typedef int(^DaleBlocks)(int a,int b);//将这个类型的Blocks定义成关键字,使用起来会非常方便
DaleBlocks blockModel=^(int a,int b)
{
return a+b;
};
返回值类型 (^代码块名)(参数类型列表)=^(参数类型1 参数名1,...){Blocks主体};
如果想在Block中访问变量需要用__block来修饰
例如:
__block int x=0;
上面这种在block体内(作用域)值能改变,但是出了block又变回最初的时候了 。这点跟普通函数很像(除非在C中传指针)
Apple文档中描述" A block is an anonymous inline collection of code, and sometimes also called a "closure" "
clang工具可以帮助我们分析Block(它将OC源码改写成C)
深入学习Block
可参考文章:Apple-Blocks Programming Topics
Wiki: http://zh.wikipedia.org/wiki/块_(C语言扩展)
摇滚诗人-对Objective-C中Block的追探:http://www.cnblogs.com/biosli/archive/2013/05/29/iOS_Objective-C_Block.html
唐巧-谈Objective-C block实现:
http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/