标签:
block的概念
1 block是一个类型,block对象是一个C级别的语法和运行机制,它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,Block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响 2 你可以用Block来写一些可以传到API中的函数语句,可选择性地存储,并可以使用多线程.作为一个回调,Block特别的有用,因为Block即包含了回调期间的代码,又包含了执行期间需要的数据 3 由于Objective-C 和 C++ 都是衍生自 C,block被设计为可同时兼容三种语言
block的基本用法
1 用 "^" 操作符来声明一个Block变量,并指明Block述句的开始,Block的主体部分包含在{}内,像下面的例子中一样(与C语法一样,";" 指明语句的结束 2 例: 3 int (^myBlock)(int) =^(int num){return num * nuItiplier;}; 4 5 1)block最简单形式 6 定义格式: 7 void test(){};---->void (test)()=^{}; 8 返回值类型 (^变量名)(参数)=^{ 9 代码块 10 }; 11 调用格式: 12 block 变量名(); 13 14 例如: 15 //定义block变量的同时进行赋值 16 void(^myTest)()=^{ 17 18 }; 19 //先定义后赋值 20 void (^myTest1)(); 21 myTest1=^{ 22 23 }; 24 25 //使用block 26 myTest(); 27 28 带有参数的block 29 30 void (^myBlock)(int ,int )=^(int x,int y){}; 31 32 带有参数并带有返回值的block 33 int (^blockSum)(int,int)=^(int x,int y){return x+y};
block的typedef
1 指针回顾 2 指针和指针的关系 3 4 指针和数组之间的关系 5 1)指针和一维数组(数组指针) 6 2)指针和二维数组 7 8 指针和字符串 9 10 指针和函数 11 1)指针函数 12 2)函数指针 13 14 指针和结构体 15 16 指针和文件 17 18 函数指针的回顾 19 1)函数指针的使用: 20 函数指针变量定义的一般形式为: 21 类型说明符 (*指针变量名)(); 22 其实"类型说明符" 表示被指函数的返回值的类型 23 (* 指针变量名)表示 * 后面的变量是定义的指针变量 24 25 typedef int (*newType)(int x ,int y); 26 newType 是别名 27 28 block别名的使用 29 30 1) 31 //MyBlock2 是一个bolock 变量名 32 //先定义block变量,再给变量赋值 33 // myBlock2 特点: 34 // 只能赋值这样block ;1 没有返回值 2没有参数 35 void (^myBlock2)(); 36 myBlock2=^{}; 37 myBlock2(); 38 39 2)给没有返回值 并且没有参数的block类型起一个别名 40 typedef void (^newBlockType)(); 41 //此时注意,newBlockType不再是一个block类型的变量名了,是一个新的类型 42 43 newBlockType f1;//f1 是一个 没有返回值,没有参数类型的变量名 44 45 f1=^{}; 46 f1(); 47 48 3)有参数的 49 typedef int (^newBlockType2)(int ,int); 50 new BlockType2 f2= ^(int numb,int num2){ 51 return numb+num2; 52 }; 53 int s =f2(20,12);
在block内部修改外部的值
1 需要在外部的变量前 加上__block 2 3 例如: 4 __block int m =1200; 5 6 void (^myBlock)()=^{ 7 m=1000; 8 };
将block作为参数使用
1 void days(void (^dayBlock)(){ 2 NSLog(@"起床"); 3 dayBlock(); 4 NSLog(@"起床"); 5 } 6 7 //调用days有两种方法 8 1)传一个block类型的变量过去 9 void(^block1)()=^{}; 10 days(block1); 11 12 2)调用函数的同时,同时传递参数 13 days(^{});
将block作为函数的返回值
1 1)使用typedef 定义一个新的类型 2 //给block起一个别名 3 4 typedef int (^newType)(int num1,int num2); 5 6 2)使用新类型作为函数的返回值 7 8 //定义一个返回值是block类型的函数 9 newType test4(){ 10 newType work=^(int x,int y){ 11 return x+y; 12 } 13 return work; 14 }
block使用技巧以及注意
1 1)block变量用作方法的参数的时候 2 最好把参数类型列表部分加上,具体的形参名 3 void test4(int (^myBlock)(int num1,int num2)){ 4 5 } 6 //当block代码块直接作为函数的参数 7 //写法发生变化了 8 //参数 这样写: ^int (int x,int y){return x+y;} 9 int main(int argc,const char *argv[]){ 10 test4(^int(int num1,int num2)myBlock); 11 return 0; 12 } 13 14 15 16 17 block和函数的区别 18 1)定义方式不一样 19 2)block是一个类型 20 3)函数不可以嵌套定义,block可以嵌套 21 4)block因为是一种数据类型,所以可以作为函数的参数和返回值 22 函数则不可以 23 5)block可以作为类型修饰变量,函数不行
标签:
原文地址:http://www.cnblogs.com/developer-wang/p/4506162.html