OC学习之block
2016-03-18 本文已影响47人
龙马君
/**
* OC 的block,用于封装一段代码,可以在任何时候执行
* 也可以作为函数参数和返回值
* block,在多线程、异步任务,集合遍历,集合排序、动画专场用得多
* 跟C的函数指针很像
* 格式:
int (^myBlock)(int) = ^(int num){ return num * num; };
|
返回 block名称 参数 形参 block体 ;结尾
* 使用:
* int x = myBlock(10, 20);
*/
/**
* 返回int,参数传入int,int 的block类型
*
*/
typedef int (^SubBlock)(int, int);
void testBlockUse(){
/**
* 无返回值和参数列表的block
*/
void (^myPrintBlock)() = ^{
NSLog(@"myPrintBlock");
};
myPrintBlock();
/**
* 返回int,参数传入int,int 的block
*
*/
int (^sumBlock)(int, int) = ^(int a, int b){
return a + b;
};
NSLog(@"sumBlock = %d", sumBlock(12, 13));
SubBlock subBlock = ^(int a, int b){
return a - b;
};
NSLog(@"subBlock = %d", subBlock(12, 13));
/**
* 使用__block才可以修改外部变量,否则这能读取不能写入
* 无使用__block时,block拷贝了变量的副本;
* 使用__block时,block保存变量的指针;
*/
int val = 0;
__block int val1 = 0;
int test1 = 0;
__block int test2 = 0;
void (^myBlock)() = ^{
// 保存val1、test2 的指针
// 保存val、test的变量副本
printf("myBlock val = %d\n", val); // val = 0
printf("myBlock val1 = %d\n", val1); // val1 = 0
// val = 1; 不能修改
val1 = 1;
printf("myBlock test1 = %d\n", test1); // test1 = 0
printf("myBlock test2 = %d\n", test2); // test2 = 10
};
test1 = 10;
test2 = 10;
myBlock();
printf("val = %d\n", val); // val = 0
printf("val1 = %d\n", val1); // val1 = 1
printf("test1 = %d\n", test1); // test1 = 10
printf("test2 = %d\n", test2); // test2 = 10
}