现在总结一下,之前讨论的各种场景
- 值类型 对本地变量,block 声明时,会内部有一个同名同类型的变量
- 静态局部变量,block 声明时,产生的时一个类型指针,指向静态变量,初始化是进行赋值操作
- reference type 引用类型,如 NSObject, block 被block 捕获时
- NSObject,block 捕获时,引用计数+1
- block 捕获时
- 在栈上,copy 到堆上,引用计数+1
- 在堆上,引用计数+1
- 引用类型在释放时
- NSObject 引用计数 -1, = 0 时,释放内存
- block 引用计数 -1, 释放block 内存
__block 修饰任意类型,都会生成 Block_byref 的结构体,如果修饰的是 对象, block,内部有 copy, dispose help,否则,没有。
__weak 只能 修饰 block, NSObject 类型的对象,在构建结构体时,与 没有 weak 修饰的没有什么不同,只是属性标示 __weak, 其他的时一样的。
在 block 进行 copy 操作时,如果 有 Block_byref, NSObject, Block,则会进行内部copy
-
Block_byref copy forwarding
block copy - block forwarding
NSObject 的操作 与 普通的 对象无区别,block 内部 会调用,+1, -1 操作
block 操作,会调用,相应的辅助函数 来完成 copy, dispose
byref 会调用相应的辅助函数来完成操作
网友评论