feat: refine

This commit is contained in:
LiuBinPeng
2022-05-30 15:03:36 +08:00
parent 6cd0cf5144
commit 55d66cc4c5
15 changed files with 149 additions and 149 deletions

View File

@@ -6,7 +6,7 @@ block 本质上就是一个 oc 对象,也有 isa 指针
block 是封装了函数调用和函数调用环境的 OC 对象
![](./../assets/block-structure.png)
![](https://github.com/FantasticLBP/knowledge-kit/raw/master/assets/block-structure.png)
```objectivec
int age = 27;
@@ -247,7 +247,7 @@ NSLog(@"%@", [[block class] superclass]); // NSBlock
NSLog(@"%@", [[[block class] superclass] superclass]); // NSObjec
```
![](./../assets/block-memorylayout.png)
![](https://github.com/FantasticLBP/knowledge-kit/raw/master/assets/block-memorylayout.png)
代码存放在 text 段static 修饰的数据存放在 data 区,程序员手动申请的内存存放在堆,局部变量存放在栈区
@@ -598,7 +598,7 @@ static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
可以看到 `__block int age = 27;` 变为了 `__Block_byref_age_0 age` 结构体。block 内部的函数在修改 age 的时候其实就是通过 `__main_block_impl_0` 结构体的 age 找到 `__Block_byref_age_0`,然后访问 `__Block_byref_age_0` 中的成员变量 `__forwarding` 访问成员变量 age并修改值。
![](./../assets/block-forwarding.png)
![](https://github.com/FantasticLBP/knowledge-kit/raw/master/assets/block-forwarding.png)
`__block` 修饰基本数据类型和对象,对于生成的结构体也不一样。
@@ -692,7 +692,7 @@ int main(int argc, const char * argv[]) {
我们将断点设置到 NSLog 这里,打印出自定义结构体 `__main_block_impl_0` 中的 age 。
![](./../assets/Block-variableAddress.png)
![](https://github.com/FantasticLBP/knowledge-kit/raw/master/assets/Block-variableAddress.png)
```c
// 0x0000000105231f70
@@ -736,7 +736,7 @@ block 内部对变量的值修改其实就是对 block 内部自定义结构体
## `__forwarding` 的设计
![](./../assets/block_forwarding.png)
![](https://github.com/FantasticLBP/knowledge-kit/raw/master/assets/block_forwarding.png)
当block在栈中时`__Block_byref_age_0`结构体内的`__forwarding`指针指向结构体自己。
@@ -750,7 +750,7 @@ block 内部对变量的值修改其实就是对 block 内部自定义结构体
`__block ` 修饰符修饰的对象在内存中如下
![](./../assets/block-object-memoery.png)
![](https://github.com/FantasticLBP/knowledge-kit/raw/master/assets/block-object-memoery.png)
```c
@@ -871,7 +871,7 @@ p.block();
`__unsafe_retained` 因为不安全所以不推荐,`__block` 因为使用繁琐,且必须等到调用 block 才会释放内存所以不推荐。ARC 下最佳用 `__weak`
![](./../assets/block_object_cycle.png)
![](https://github.com/FantasticLBP/knowledge-kit/raw/master/assets/block_object_cycle.png)
### MRC 下