/**
* 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
}
OC学习之block
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 代码块(Block)/闭包(closure) 是对C语言中函数的扩展。代码块两种类的绑定:自动绑定(automat...
- $ 问题抛出来 1.所有自定义方法的block都需要__weak 吗?2.凡是, block内带 self的都需要...
- 闭包是自包含的函数代码块,可以在代码中被传递和使用.(参考OC中的Block) 一. 定义闭包或者block 1....