blocks的概念:
Block是OC中的一种数据类型,和c语音函数指针类似,运行需要编译器和运行时的支持(ios4.0开始支持 Blocks )两个对象之间通信,用到Blocks,相当于回调函数。
blocks和C语言函数指针的区别:
int (*CFunc) (int a);
返回类型 (标志符号 名称) (参数类型 参数名);
int(^Blocks) (int a);
blocks的声明(定义):
void (^myBlocks) () = NULL;
void (^myBlocks2) (NSString *name,int score) = NULL;
(返回类型)(^块名称)(参数类型)
blocks的使用:
1.赋值
myBlocks = ^(){
NSLog(@"hello!");
};
/*
//后面没有参数的时候括号可以省略
myBlocks = ^{
NSLog(@"hello!");
};
*/
//行参名可以省略
void (^myBlocks2) (NSString *,int) = NULL;
*/
myBlocks2 = ^(NSString *name,int score){
NSLog(@"%@,you got %i point",name,score);
};
1.调用
myBlocks();
myBlocks()2;
如果没有参数,等号后面参数列表的()可以省略,例如
void (^myBlocks) = NULL;
myBlocks = ^{
NSLog(@"It's Ok!");
}
blocks作为函数形参:
void printWithBlocks(void (^blocks) ())
{
blocks();
}
printWithBlocks(
myBlocks
);
_block关键字:
作用:可以让blocks访问被_block修饰的外部变量,相当于被_block修饰的变量变为全局变量。
示例代码:
void test()
{
int a = 1;
__block int b = 2;
void (^block)();
block = ^{
// block内部可以访问外面的变量
//NSLog(@"a = %d", a);
// 默认情况下,block内部不能修改外面的局部变量
// a = 20;
// 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
b = 25;
};
block();
}
|
|