[Blocks是指就是c语音中的函数指针]
Blocks最早是从苹果本地的雪豹,移植到iPhone。官方建议多用blocks,在多线程应用比较广泛
(1)Blocks 是什么
(2)Blocks 和 c语音函数指针的区别
(3)如何调用Blocks
(4)代理2端如何通过Blocks通信
(1)Blocks 是什么
和c语音函数指针类似,运行需要编译器和运行时的支持(ios4.0开始支持 Blocks )
两个对象之间通信,用到Blocks,相当于回调函数。
(2)Blocks 和 c语音函数指针的区别
(3)如何调用Blocks
typedef 定义:
_ _block关键字:
变成一个全局变量
blocs简单用法:
block 申明:
void (^myblocks)(void) =NULL;
block 赋值:
myblocks = ^(void){
NSLog(@"in blocks");
};
block 调用:
myblocks();
例子1:
int (^myblocks2)(int a, int b) = ^(int a, int b){//赋值 int c = a+b; return c; } int ret = myblocks2(10,20);//执行
例子2:
__block int sum = 0;//变成全局变量 int (^myblocks3)(int a, int b) = ^(int a, int b){ sum = a+b; return sum; } myblock3(20,30);
例子3:
typedef int (^SumBlockT)(int , int);//定义一个类型 SumBlockT myblocks4 = ^(int a, int b){ NSLog(@"sum: %d", a+b);return 0; } myblock4(10,12);
(4)代理2端如何通过Blocks通信
iphone开发用到的blocks:
人中定义一个blocks,狗每次定时调用这个blocks;
狗中定义一个blocks,用来存放人中的定义的blocks函数。
狗:
.h
void (^BarkCallback)(Dog *thisDog, int count);//变量
- (void) setBark:( void(^)(Dog *thisDog, int count))eachBark;//向外暴露这个函数,给人赋值的。
.m
- (void)updatatime:(id)arg
{
if(BarkCallblack)
{
BarkCallback(self, barkCount);
}
}
- (void) setBark:( void(^)(Dog *thisDog, int count))eachBark
{
[BarkCallblack release];
BarkCallblack = [eachBark copy];//copy是因为setDog函数可能被释放。
}
-(void) dealloc
{
[BarkCallblack release];
[super dealloc];
}
人:
setDog函数里面:
[_dog setBark:^(Dog *thisDog, int count){
NSLog(@"person dog %d count %d\n", thisDog.ID, count );
}]