Block

239 阅读1分钟

1:block 本质上是一个 OC 对象,它内部也有一个 isa指针

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

3:

4:auto(默认)修饰的局部变量是值传递,static修饰的局部变量是指针传递,全局变量无需捕获,直接访问

block的变量捕获

5:oc方法默认会传参 方法调用者self和方法名_cmd

6:block有3中类型,可以通过 class 方法或者isa指针查看具体类型,最终都是继承自NSBlock类型

  __NSGlobalBlock__ (_NSConcreteGlobalBlock) //数据区
  __NSStackBlock__ (_NSConcreteStackBlock)//栈区
  __NSMallocBlock__ (_NSConcreteMallocBlock)//堆区

7:block的类型

block的类型

8:__NSStackBlock__调用copy就会变成__NSMallocBlock__

9:ARC会自动copy 的情况:

10:栈空间的 block 是不会持有外来对象的,堆空间的 block 是会对外来对象进行 retain 操作

11:

12:block一旦访问的是OC对象,就会生成 copy 函数和 dispose 函数

13:block修饰符

14:block__forwarding指针

15:__unsafe_unretained:不会产生强引用,不安全,指向的对象销毁时,指针存储的地址值不变,再去访问时报野指针错误,__weak:不会产生强引用,指向的对象销毁时,指针存储的地址值变为 nil.

16:MRC不支持__weak