iOS block 使用总结

111 阅读1分钟

一:Block本质

问:block是什么? block的本质是什么?

1.block本质上也是一个oc对象

2.block是封装了函数调用以及函数调用环境的oc对象

3.block 是封装函数及其上下文的oc对象

二:block的变量捕获

对于auto变量block访问是值传递,static变量block访问方法是指针传递. block 不捕获全局变量,都是直接采用取值的.

问:为什么局部变量需要捕获

考虑作用域的问题,需要跨函数访问,就需要捕获 block 对self 也是会捕获的

三:block的类型

block 一共有三种类型.

  • NSGlobalBlock 在数据区

  • __NSStackBlock __ 在栈区

  • __NSMallocBlock __ 在堆区

四:block类型判断

  • blcok类型判断:根据是否访问auto变量,来区分.没有访问auto变量则是 globalBlock,反之则是stackBlcok.对stackblock进行copy操作 会转为 mallocblock.
  • 储存位置globalBlock 在数据区,stack在栈区.malloc在堆上.

五:block 修改nsmutablearry

如果是只是往数组里面添加元素,则不需要使用 __block 但是如果要修改数组本身比如要初始化,那就需要使用