OC-block
2015-11-21 14:35
447 查看
#import <Foundation/Foundation.h> /* block要掌握的东西 1> 如何定义block变量 int (^sumBlock)(int, int); void (^myBlock)(); 2> 如何利用block封装代码 ^(int a, int b) { return a - b; }; ^() { NSLog(@"----------"); }; ^ { NSLog(@"----------"); }; 3> block访问外面变量 * block内部可以访问外面的变量 * 默认情况下,block内部不能修改外面的局部变量 * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 4> 利用typedef定义block类型 typedef int (^MyBlock)(int, int); // 以后就可以利用MyBlock这种类型来定义block变量 MyBlock block; MyBlock b1, b2; b1 = ^(int a, int b) { return a - b; }; MyBlock b3 = ^(int a, int b) { return a - b; }; */ typedef int (*SumP)(int, int); typedef int (^MyBlock)(int, int); int sum(int a, int b) { return a + b; } int main() { // int (*p)(int, int) = sum; // int (*p2)(int, int) = sum; // SumP p = sum; // SumP p2 = sum; /* int (^sumBlock)(int, int); sumBlock = ^(int a, int b) { return a + b; }; int (^minusBlock)(int, int) = ^(int a, int b) { return a - b; };*/ MyBlock sumBlock; sumBlock = ^(int a, int b) { return a + b; }; MyBlock minusBlock = ^(int a, int b) { return a - b; }; MyBlock multiplyBlock = ^(int a, int b) { return a * b; }; NSLog(@"%d - %d - %d", multiplyBlock(2, 4), sumBlock(10 , 9), minusBlock(10, 8)); return 0; } void test3() { int a = 10; __block int b = 20; void (^block)(); block = ^{ // block内部可以访问外面的变量 //NSLog(@"a = %d", a); // 默认情况下,block内部不能修改外面的局部变量 // a = 20; // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 b = 25; }; block(); } // 有返回值、有形参的block void test2() { /* // 指针函数的指针 int (*p)(int, int) = sum; int d = p(10, 12); NSLog(@"%d", d); */ int (^sumblock)(int, int) = ^(int a, int b){ return a + b; }; int c = sumblock(10, 11); // 用一个block输出n条横线 void (^lineBlock)(int) = ^(int n) { for (int i = 0; i<n; i++) { NSLog(@"----------------"); } }; lineBlock(5); } // 没有返回值、没有形参的block void test() { // block用来保存一段代码 // block的标志:^ /* block跟函数很像: 1.可以保存代码 2.有返回值 3.有形参 4.调用方式一样 */ // 定义block变量 /* void (^myblock)() = ^(){ NSLog(@"----------------"); NSLog(@"----------------"); };*/ // 如果block没有形参,可以省略后面的() void (^myblock)() = ^{ NSLog(@"----------------"); NSLog(@"----------------"); }; // 利用block变量调用block内部的代码 myblock(); myblock(); }
- Block封装了一段代码,可以在任何时候执行
- Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
- 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
Blocks的定义:
int (^MySum)(int, int) = ^(int a, int b) { return a+b; };
定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
Block可以访问局部变量,但是不能修改。
int sum = 10; int (^MyBlock)(int) = ^(int num) { sum++;//编译报错 return num * sum; };
如果要修改就要加关键字:__block
__block int sum = 10;
Blocks和函数指针对比:
- 定义函数指针 int (*myFn)();
- 定义Blocks int (^MyBlocks)(int,int);
- 调用函数指针 (*myFn)(10, 20);
- 调用Blocks MyBlocks(10, 20);
Blocks的赋值
1,在声明的同时定义变量,然后赋值int (^MySum)(int,int) = ^(int a,int b) {
return a + b;
};
2,也可先用typedef先声明类型,再定义变量进行赋值typedef int (^MySum)(int,int);
MySum sum = ^(int a,int b) {
return a + b;
};
相关文章推荐
- 仿京东顶部加载动画
- jQuery sibings()的作用
- linux 更换 软件源后 GPG错误
- 算法虐我千百遍,我待算法如初恋
- Git基本操作
- ORACLE Instant Client 安装
- java 文件传输 分块传输
- JS:offsetWidth\offsetleft 等图文解释
- 实习小白::(转) Cocos2d-x 3.0 开发(八)骨骼动画的动态换肤
- PAT 1041. Be Unique (20)
- C++ 学习(继承和动态内存分配)
- 图像处理opencv直方图均值化-学习笔记2
- C#基础篇总结(二)
- Http常见返回数据
- 深入解析C++ STL中的常用容器
- 11g 新特性 CHM(Cluster Health Monitor)
- 重学C语言(一) 字符串数组输出
- 实习小白::(转) Cocos2d-x 3.0 开发(四)使用CocoStudio创建UI并载入到程序中
- HDU 1864最大报销额 01背包问题
- dubbo hello word