博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
block初窥
阅读量:6997 次
发布时间:2019-06-27

本文共 3570 字,大约阅读时间需要 11 分钟。

一.block的简单使用

1.block声明

block变量的声明格式为: 返回值类型 (^block名字)(参数列表);

  • 声明一个无返回值,有两个NSString参数,名字为ablock的block void (^ablock)(NSString * str1,NSString * str2);
  • 形参变量名可以省略,只留下形参类型 void (^ablock)(NSString * ,NSString * );

2.block赋值

block的赋值格式为: ablock变量=^(参数列表){函数体} ;

//1.在此先声明一个名为ablock的block    void (^ablock)(NSString * str1,NSString * str2);    //2.在此将等号右边的block代码块的实现赋值给ablock变量    ablock = ^(NSString * str1,NSString * str2){        NSLog(@"%@,%@",str1,str2);    };    //3.在这里调用ablock    ablock(@"lisj",@"ddsd");复制代码

block 赋值格式 block变量 = ^返回值类型(参数列表){函数体};

  • 其中,返回值类型可以书省略,因为编译器可以根据存储代码块的变量中,确定返回值的类型.

3. 在声明block的同时对其进行赋值
  • 简化block的声明和定义的过程,一步到位,直接调用即可
//1.声明block,并定义   int (^myblcok) (int,int) = ^ (int c,int d){        return c*d;   };//2.有参数有返回值的block调用    NSLog(@"%d", myblcok(4,5));//这里会在控制台打印20复制代码
  • 如果没有参数列表,赋值时,参数列表可以省略
//1.无返回值无参数block的声明及定义 void (^oneblcok) () = ^ {        NSLog(@"hello world ");//打印hello world    };//2.无参,无返回值block的调用 oneblcok();复制代码

二.block的进阶使用

1.block作为C函数参数

  • 第一种语法
//1.声明一个求和函数    void  useBlockInC(int (^block)(int a ,int b)){    NSLog(@"%d",block(30,30));}//2.定义一个block,用来实现求和的功能(主要逻辑部分,根据自己的需求在这里写代码)    int (^addBlock)(int,int )=^(int x,int y){        return  x+y;    };//3.调用函数    useBlockInC(addBlock);复制代码
  • 第二种语法(第一种的简化版--常用)
    • 将第一种语法中的第2步和第3步结合起来,简化语法
//1.声明一个求和函数(第一步相同)    void  useBlockInC(int (^block)(int a ,int b)){    NSLog(@"%d",block(30,30));}////简化,把2和3结合起来,简化之后如下方式//示例1    useBlockInC(^int(int a, int b) {        return a*b;//这里的代码逻辑根据项目需求写,可灵活多变,只要符合语法    });//示例2     useBlockInC(^int(int a, int b) {        return a-b;//比如变成减法    });复制代码
  • block用作函数参数,相当于传进来了一种数据类型,可以拿到相应的参数来做自己想做的事.
  • block一般用作函数参数时,多为无返回值类型.

2.block作为OC函数参数

  • 第一种语法
//1:写自己需要用到block做参数的函数-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{    block(@{@"name":@"myName is bob"});}//2:声明一个block变量,并把具体的代码块赋值给block变量    void (^dicBlock) (NSDictionary *) = ^(NSDictionary * dic){        for (NSString * item in dic)         {            NSLog(@"%@",item);          }    };//3:调用函数,将block当做参数传入函数    [self useBlockInOC:dicBlock];    复制代码
  • 第二种语法
    • 简化版(第二步和第三步合并)
//1:写自己需要用到block做参数的函数-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{    block(@{@"name":@"myName is bob"});}//2.调用函数,代码块内写逻辑代码    [self useBlockInOC:^(NSDictionary *dic) {        NSLog(@"%@", [dic objectForKey:@"name"]);    }];复制代码

3. 使用typedef 定义block类型,可以简化block在C中的使用

//第一步,使用typedef声明block类型typeBlock  typedef void (^typeBlcok) (NSArray *);//第二步,创建一个block的变量,并把block的代码块赋值给这个新创建的变量  typeBlcok newBlcok =^(NSArray * arr){        for (id item  in arr) {            NSLog(@"%@",item);        }    };//第三步:调用block,记得传入参数    NSArray * arr=@[@"战狼2",@"吴京",@"敦刻尔克",@"蜘蛛侠",@"极限挑战",@"美丽的五险",@"你好,佳人",@"成语大会",@"创业故事"];        newBlcok(arr);//调用block复制代码

4.使用typedef简化block在OC中的使用方法

  • 第一种语法
//1.使用typeBlock声明一种block的类型,简化block的用法typedef void(^typeBlock) (NSDictionary * dic);//2.写自己需要的函数-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{    block(@{@"name":@"myName is bob"});}//3.用声明的typeBlock类型创建一个block变量,然后把具体的代码块赋值给对象    typeBlock block = ^(NSDictionary *dic) {        NSLog(@"%@", [dic objectForKey:@"name"]);    };    //4.调用函数,将block当做参数传入函数    [self useBlockInOC:block];    复制代码
  • 第二种语法
//1.使用typeBlock声明一种block的类型,简化block的用法typedef void(^typeBlock) (NSDictionary * dic);//2.写自己需要的函数-(void)useBlockInOC2:(typeBlock)block{    block(@{@"name":@"myName is bob"});}//3.调用函数,简化版,代码块内直接写逻辑代码    [self useBlockInOC:^(NSDictionary *dic) {        NSLog(@"%@", [dic objectForKey:@"name"]);    }];复制代码

解释:无论是C语言或者是OC语言,第二种语法最常用.第一种语法可以看做是第二种语法的来源或者原理

转载于:https://juejin.im/post/5a39dcdc6fb9a045076fcf3d

你可能感兴趣的文章
EntityType 'UserInfo' has no key defined. Define the key for this EntityType.
查看>>
Merge PDF File using itextsharp library
查看>>
使用微软的TFS云服务
查看>>
[已解]如何设置xib 中 ipad 的开发模式为横屏
查看>>
Repeater控件使用
查看>>
[Android] 华为荣耀2制作fastboot线刷包[海思平台]
查看>>
慢慢 的变老
查看>>
高效能TCP通讯基础组件Beetle.Express
查看>>
MyEclipse内存不足配置
查看>>
四舍五入网络Java保留两位小数
查看>>
MFC 循环界面假死的解决(MFC 按钮终止循环)
查看>>
详细解说九宫图比较常用的多控件布局
查看>>
程序员的出路在哪里?挣钱的机会来了续-福利来了,仿QQ界面,放出全部源码,打造创业框架及实现思路...
查看>>
C语言中的 (void*)0 与 (void)0
查看>>
DIV固定在页面某个位置,不随鼠标滚动而滚动
查看>>
android 根据SD卡中图片路径读取并显示SD中的图片——源代码
查看>>
浅析Android线程模型一 --- 转
查看>>
Cocos2d-x PluginX (二)增加新的Plugin
查看>>
python-django开发学习笔记四
查看>>
cocos2d-x开发记录:二,基本概念(导演,场景,层和精灵,场景切换,效果)...
查看>>