OC中的block-创新互联

block的概念OC中的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   //使用block26         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可以作为类型修饰变量,函数不行

网站标题:OC中的block-创新互联
网页网址:http://scyanting.com/article/depepi.html