block初窥

一.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语言,第二种语法最常用.第一种语法可以看做是第二种语法的来源或者原理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,752评论 0 23
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,118评论 29 470
  • 2.1 Blcoks概要 2.1.1 什么是Blocks Blocks是C语言的扩充功能——“带有自动变量(即局部...
    SkyMing一C阅读 2,316评论 6 18
  • 开篇 6.12 一些工作上的事,这段时间也差不多可以算告一段落了。翻了一下印象笔记App里2017年阅读记录,20...
    池中泛舟阅读 633评论 0 0
  • 你好,黄山。 去之前,一直在打算着,看云海看日出,看看不一样的风景。 在火车上,就迫不及待的看了一场日出。微茫的太...
    可嘻可樂阅读 676评论 0 0