高级编译-block小结

 1 block 总结
 2  范例
 3 
 4 - (void)demoTest{
 5     
 6      int(^demoBlock)(int, char) = ^ int(int count,char str){
 7      
 8      return count+1;
 9      };
10      demoBlock(1,'b');
11 }
12  ---block声明:
13      block声明:  返回值(^block名)(参数,参数)
14      如果没有返回值 则可以 简化为 (^block名)(参数,参数),(^block名)()
15 
16 
17      ---block实现:
18      block实现:  ^返回值 (参数列表){};
19      如果没有返回值 则可以 简化为 ^(参数列表){};
20 
21  ---声明block类型
22      声明block类型:标准写法 typedef  返回值(^block名)(参数,参数)
23 typedef int(^testBlock)(int, char); //代表声明一个testBlock类型的block

24 - (void){ 25 testBlock a = ^ int(int count,char str){ 26 27 return count+1; 28 }; 29 小结:注意 int(^demoBlock)(int, char)和 typedef int(^testBlock)(int, char);都是声明block
但是前者是声明一个变量名称是demoBlock的block变量;(声明了一个block变量) 后者typedef声明是声明一个testBlock类型的block,变量名称待定,自己起吧!!(声明了一个block类)


30 ---block作为参数 31 OC方法 32 - (void)ocFountion:(NSString * (^)(NSString *a,NSString *b))block 33 { 34 35 } 36 typedef NSString * (^ocBlock)(NSString *a,NSString *b); 37 - (void)ocFountion1:(ocBlock)block 38 { 39 40 } 41 C方法 42 void cFounction(int (^cBlock)(int a,char b)) 43 { 44 45 } 46 typedef NSString * (^cBlock)(NSString *a,NSString *b); 47 void cFounction1(cBlock cblock) 48 { 49 50 } 51 ---block作为返回值 52 OC方法 53 typedef int (^ocBlockTest)(int); 54 - (ocBlockTest)ocFF 55 { 56 return ^(int a){ 57 return a+1; 58 }; 59 } 60 -(int (^)(int))ocFF1 61 { 62 return ^(int a){ 63 return a+1; 64 }; 65 66 } 67 68 C方法 69 typedef int (^cBlockTest)(int); 70 cBlockTest cFF(){ 71 return ^(int a){ 72 return a+1; 73 }; 74 75 } 76 int (^cBlockTest)(int) cFF(){//注意!!这样是不行的?? 77 return ^(int a){ 78 return a+1; 79 }; 80 81 }
 1 //指向函数的指针
 2 typedef int (*play)(char a,int b);
 3 - (void)setFounctionPoint
 4 {
 5     play o= &cFounction;
 6     o('f',1);
 7     NSLog(@"%d",o('f',1));//2
 8     
 9     
10     
11     int (*play1)(char a,int b) = &cFounction;
12     
13     play1('f',1);
14     NSLog(@"%d",play1('f',1));//2
15 
16 }
17 int cFounction(char a,int b)
18 {
19     return b+1;
20 }
 1 //block 特性一  保存自动变量的瞬间值
 2 -(void)blockCharacter1
 3 {
 4     
 5     int val = 10;
 6     const char *fmt = "val = %d
";
 7     
 8     void(^blk)(void) = ^{
 9         printf(fmt,val);
10     };
11     
12     val = 2;//这里有改动不行
13     fmt = "the value were change.val =%d
";//这里有改动也不行
14     
15     blk();// 控制台 打印结果 val = 10
16     
17 
18 }
19 //block 特性二 __block修饰符 可以修改变量值
20 typedef void (^charactorBlock)();
21 - (void)blockCharacter2
22 {
23     //实例一
24      __block int v = 1;
25     void (^testBlock)() = ^{
26         v =21;
27     };
28     testBlock();
29     NSLog(@"%d",v);
30     
31     //实例二
32    const NSArray *array = @[@1,@2];
33     charactorBlock a =^{
34           NSLog(@"%@",array[1]);
35     };
36     
37     a();
38      //实例三
39    //char test[] = "hello";//报错无法提取  获取自动变量的方法,没有实现对c语言数组的截取
40     char *test  = "hello";//可以
41     
42     charactorBlock b = ^{
43         printf("%c",test[2]);
44     };
45     b();
46    
47 }
48 
49 

//block 循环引用问题

 

原文地址:https://www.cnblogs.com/ly1973/p/6878942.html