简说block

block 在Objective-C 中使用的频率还是非常高的,网上关于介绍block 的文章也非常多,本文旨在用最少、最浅显的语言介绍block。

block 是什么?

block 在OC 中就是一个对象,但他的值是一段代码,并且有返回值和入参。

// 声明数组
NSArray *array = @[@"a", @"b"];

// 声明block
NSInteger (^sumNumbersBlock)(NSInteger a, NSInteger b) = ^(NSInteger a, NSInteger b) {
  return a+b;
};

从表面上看,声明数组和block 还是有很大不同的,但还是有一些相同点:
等号左边命名部分:

NSInteger (^sumNumbersBlock)(NSInteger a, NSInteger b);
  1. 返回值:block 需要指定返回值,上面的代码中返回值类型为NSInteger,如果什么都不返回,使用void 就可以了
  2. 类型+变量名称:格式为:(^blockName),其中^ 表示对象类型为block,并用()^ 和对象名称包起来。
  3. 参数:如果参数为空,使用(),若不为空,像这样写(NSInteger a, NSInteger b)

等号右边赋值部分:
三部分:^ + ( 参数 ) + { block 实现的逻辑代码 }

void (^block)(NSInteger a, NSInteger b);
block = ^(NSInteger a, NSInteger b) {
  // your code
};

block 应该注意的细节:

  1. 局部变量:block 中修改局部变量时需要使用__block 修饰符,否则只能获取但不能修改。
  2. 全局变量:block 中可以直接获取并且修改,不需要任何修饰符。
  3. 循环引用:block 中的对象变量需要使用__weak 修饰符,防止循环引用导致内存泄露。
  4. block 中的变量(除对象变量)在block 代码块之后发生变化,该变量在block 中也不会发生变化。

block 应用场景

  1. 回调:block 作为属性时,可以直接将回调的代码对block 进行赋值,相比delegate,结构更加简单,代码预读起来也更加方便。
  2. 入参:block 可以作为方法的入参使用,可以有效的分离业务模块和功能模块,降低代码的耦合。
  3. OC 链式编程:OC 中使用链式编程可以使用block 实现。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,263评论 30 472
  • Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。...
    Coder_JMicheal阅读 752评论 2 1
  • 在介绍Block之前通过一个简单的应用场景认识下Block 场景描述如下:TableView上面有多个Custom...
    黑_白_灰阅读 1,432评论 4 29
  • iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...
    smile刺客阅读 2,390评论 2 26
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,792评论 0 23