Block基础点总结

1.定义

  1. Block是OC中的一种数据类型,在iOS开发中被广泛使用,是用来保存一段代码
  2. ^是Block的特有标志
  3. Block的实现代码包含在{}之间
  4. 大多情况下,以内联inline函数的方式被定义和使用
  5. Block与C语言的函数指针有些相似,但使用起来更加灵活
    5.1) 可以保存代码
    5.2) 有返回值
    5.3) 有形参

block的定义方式:
先写^,然后写返回值类型,接着是参数类型,参数名,然后是大括号,分号,大括号里面的代码

//定义block
//返回值可以自己推断出来是什么类型的
^int(int x,int y){
    return x + y
};
解释:
^ : block的标志:
第一个int:返回值类型;
int x:  第一个参数类型和参数名;
int y:第二个参数类型和参数名;
{}里面是我们想实现的某些功能,不能少了分号。

例如:

格式说明:
(返回类型)(^块名称)(参数类型) = ^(参数列表){
            代码实现
};
//如果没有参数,等号后面参数列表的()可以省略
#无返回值,无参数
void(^demoBlock)() = ^void(){
     NSLog(@"hello world");
}();//在此加上小括号()就是block调用
或者
void(^demoBlock)() = ^{
    NSLog(@"hello world");
};
#无返回值,有参数
void (^sumBlock) (int,int) = ^(int x,int y){
       return x + y;
};
#有返回值,无参数
NSString(^demoBlock)() = ^NSString *(){
       return @"hello world";
};
#有返回值,有参数
int(^demoBlock)(int x,int y) = ^int(){
       return x * y;
};

2.常见相关面试题
block可以使用在定义之前声明的局部变量:

int i = 10;
void(^myBlock)() = ^{
       NSLog(@"%d",i);
};
i = 100;//实际上并没有效果
myBlock();

#输出结果为:10

注意:
(1) 在定义Block时,会在Block中建立当前局部变量内容的副本(拷贝)
(2) 后续再对该变量的数值进行修改,不会影响Block中的数值
(3) 如果需要在block中保持局部变量的数值变化,需要使用__block关键字
(4) 使用此关键字后,同样可以在Block中修改该变量的数值

3.当做参数传递
Block可以被当做参数直接传递:

NSArray *array = @[@"张三",@"李四",@"尼玛",@"赵五"];
    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%d %@",(int)idx,obj);
        if ([@"尼玛" isEqualToString:obj]) {
            *stop = YES;
        }
    }];
#说明:遍历并NSLog()array中的内容,当obj为“尼玛”时停止遍历

4.使用局部变量
在被当做参数传递时,Block同样可以使用在定义之前声明的局部变量:

int stopIndex = 1;
    NSArray *arr = @[@"张三",@"李四",@"尼玛",@"赵五"];
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"第%d项内容是%@",(int)idx,obj);
        if ([@"尼玛" isEqualToString:obj] || idx == stopIndex) {
            *stop = YES;
        }
    }];

注意:默认情况下,Block外部的变量,在Block中是只读的

BOOL flog = NO;;
    NSArray *ar = @[@"张三",@"李四",@"尼玛",@"赵五"];
    [ar enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        if ([@"尼玛" isEqualToString:obj] || idx == stopIndex) {
        *stop = YES;
        flog = YES; //编译错误 爆红了
      }
    }];

5.__block关键字
如果需要修改Block之外的局部变量,需要使用这个关键字

__block BOOL flog = NO;
    NSArray *ar = @[@"张三",@"李四",@"尼玛",@"赵五"];
    [ar enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
          if ([@"尼玛" isEqualToString:obj] || idx == stopIndex) {
        *stop = YES;
        flog = YES; //现在可以修改了!!!!
      }
    }];
提示:无需使用__block关键字,在块代码中可以修改成员变量的数值(比较少用)

6.传递对象
对象传递进Block的方式

NSString *stopName = @"尼玛";
    NSArray *nameArr = @[@"张三",@"李四",@"尼玛",@"赵五"];
    [nameArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"第%d项内容是%@",(int)idx,obj);
        if ([stopName isEqualToString:obj] || idx == stopIndex) {
            *stop = YES;
        }
    }];

为保证Block中代码正常运行,在stopName的指针传递Block时,Block会自动对stopName的指针做强引用

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

推荐阅读更多精彩内容