iOS Block

Blocks 模式

Block语法

  • ^ 返回值类型 参数列表 表达式
  • ^ 参数列表 表达式 (省略返回值类型)
  • ^ 表达式 (省略参数列表)

Block变量类型

  • 自动变量: 返回值类型 (^类型名称)(参数列表)
  • 函数参数: 返回值类型 (^类型名称)(参数列表) 返回值参数: ^类型名称()(参数列表) 使用typedef 更方便
  • 参考

Blocks的实现

Block的实质

  • __main_block_impl_0(__main_block_func_0,__main_block_desc_0_DATA)
  • blik = __main_block-impl_0
  • blk->FuncPtr

自动获取外部变量

  • 通过参数值传递到__main_block_impl_0获取

__block说明符

  • __Block_byref_intValue_0结构体:封装__block修饰的外部变量
  • _Block_object_assign函数:当block从栈拷贝到堆时,调用
  • _Block_object_dispose函数:当block从堆内存释放时,调用此函数

Block 存储域

  • _NSConcertStackBlock(栈) _NSConcertGlobalBlock(程序的数据区域.data区) _NSConcertMallocBlock(堆)
  • block 作为方法或函数的参数传递时,编译器不会自动调用 copy 方法;
  • 当block作为函数返回值返回时,编译器将block作为_Block_copy函数
  • 当 block 被赋值给 __strong id 类型的对象或 block 的成员变量时,编译器自动将 block 作为 _Block_copy
  • 当 block 作为参数被传入方法名带有 usingBlock 的 Cocoa Framework 方法或 GCD 的 API 时。这些方法会在内部对传递进来的 block 调用 copy 或 _Block_copy 进行拷贝;

__block变量的内存管理

  • 当Block从栈复制到堆时,使用的所有__block变量也从栈复制到堆,此时block持有__block变量
  • __forwarding:不管__block变量在栈上还是堆上,都能正确的访问该变量

截获对象

  • 当 block 调用 copy 方法时,如果 block 在栈上,会被拷贝到堆上;
  • 当 block 作为函数返回值返回时,编译器自动将 block 作为 _Block_copy 函数,效果等同于 block 直接调用 copy 方法;
  • 当 block 被赋值给 __strong id 类型的对象或 block 的成员变量时,编译器自动将 block 作为 _Block_copy 函数,效果等同于 block 直接调用 copy 方法;
  • 当 block 作为参数被传入方法名带有 usingBlock 的 Cocoa Framework 方法或 GCD 的 API 时。这些方法会在内部对传递进来的 block 调用 copy 或 _Block_copy 进行拷贝;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 9,908评论 10 69
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,788评论 0 23
  • 《Objective-C高级编程》是一本有趣又难懂的书,全书就讲了引用计数、Block、GCD三个概念,有趣是因为...
    kamous阅读 55,384评论 22 206
  • 1、概述 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」;Block 是...
    DeerRun阅读 683评论 0 0
  • 目录 Block概述 Block定义方式 Block保存代码 Block传值 Block对外部变量的传递 Bloc...
    子斌阅读 1,426评论 2 7