A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

黑马程序员—oc语言学习心得—block
------Java培训Android培训iOS培训.Net培训、期待与您交流------

Block封装了一段代码,可以在任何时候执行
     Block可以作为函数参数或者函数的返回值,而本身又可以带输入参数或返回值
     block,在多线程、异步任务,集合遍历,集合排序、动画专场用得多

(1)定义BLOCK变量

Int (^SumBlock)(int,int);//有参数,返回值类型为int

Void (^MyBlock)();//无参数,返回值类型为空

(2)利用block封装代码

(3)Block访问外部变量

1)Block内部可以访问外部变量;

2)默认情况下,Block内部不能修改外部的局部变量

3)给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。

4)利用typedef定义block类型(和指向函数的指针很像)

Typedef int(^MyBlock)(int ,int);

以后就可以利用这种类型来定义block变量了。

MyBlock a,b;  

a=^(int a,int b){return a-b;};

MyBlock b2=^(int n1,int n2){return n1*n2;};



  1. #import <Foundation/Foundation.h>

  2. //void (^workBlock)() block座位函数参数传递
  3. typedef void(^Newbolck)();

  4. void work(int n){
  5.    
  6.     NSLog(@"起床。。。。");
  7.     NSLog(@"刷牙。。。。");
  8.     NSLog(@"洗脸。。。。");
  9.     NSLog(@"去公司。。。。");
  10.     //workBlock();  //此处不一样
  11.     Newbolck workDay(int a); // 声明方法,因为方法主体在下面
  12.    
  13.     Newbolck w=workDay(n);//此处workDay(n)的返回值为newblock对象
  14.    
  15.     w();//执行代码块
  16.    
  17.     NSLog(@"回家。。。。");
  18. }

  19. typedef void(^newType)();

  20. //返回值为block类型
  21. newType test(){

  22.     newType n1=^{
  23.    
  24.         NSLog(@"xxxxxxx");
  25.         NSLog(@"yyyyyyyy");
  26.     };

  27.     return n1;
  28. }


  29. //带两个参数的block做做返回值
  30. typedef int(^newType2)(int,int);
  31. newType2 test2(){

  32.     return ^(int a,int b){
  33.    
  34.         return a+b;
  35.     };

  36. }


  37. //让他返回值为block类型
  38. Newbolck workDay(int a){
  39.    
  40.     //简化
  41.     //typedef void(^Block)(); //定义别名
  42.     Newbolck w; //定义bolck类型变量 不用加 * 号.....
  43.    
  44.     switch (a) {
  45.         case 1:
  46.             w =^(){
  47.             
  48.                  NSLog(@"了解项目");
  49.             
  50.             };
  51.         case 2:
  52.             w =^(){
  53.                
  54.                 NSLog(@"开发项目");
  55.                
  56.             };
  57.         case 3:
  58.             w =^(){
  59.                
  60.                 NSLog(@"卖了项目");
  61.                
  62.             };
  63.             break;
  64.             
  65.         default:
  66.             break;
  67.     }
  68.    
  69.    // work(w);
  70.     return w;
  71. }




  72. int main(int argc, const char * argv[]) {
  73.     @autoreleasepool {
  74.         //for (int i=1; i<=5; i++) {
  75.             
  76.             work(1);
  77.             
  78.         
  79.        // }
  80.         
  81.         
  82.         // 调用返回值为block类型方法
  83.         
  84.         //因为test()方法返回值是block对象 因此创建对象接受
  85.         newType n2=test();
  86.         n2();
  87.         
  88.         newType2 n3=test2();
  89.         int result=n3(3,8);
  90.         NSLog(@"result=%d",result);
  91.         
  92.         
  93.         
  94.         
  95.         workDay(1);
  96.         printf("\n");
  97.         
  98.         workDay(2);
  99.         printf("\n");
  100.         
  101.         
  102.         workDay(3);
  103.         printf("\n");
  104.         
  105.             
  106.         
  107.    
  108.         
  109.         void (^myblock)(int,int)=^(int a,int b)
  110.         {

  111.         
  112.             NSLog(@"a+b=%d",a+b);
  113.             
  114.         };

  115.          myblock(2,8);
  116.         
  117.         
  118.         typedef int(^Newbolck)(int,int);
  119.         
  120.         
  121.         Newbolck b1=^(int x,int y)
  122.         {
  123.             
  124.             return x+y;
  125.         
  126.         };
  127.         
  128.         Newbolck b2=^(int x,int y){
  129.         
  130.         
  131.             return x>y? x:y;
  132.         
  133.         };
  134.         
  135.         
  136.       
  137.         NSLog(@"b1->%d",b1(2,5));
  138.         NSLog(@"b2->%d",b2(5,9));
  139.         
  140.         
  141. }
  142.         
  143.         return 0;
  144.         
  145.    
  146.     }
复制代码


------Java培训Android培训iOS培训.Net培训、期待与您交流------


1 个回复

倒序浏览
case里漏了break
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马