iOS中block 捕获外部局部变量分析

2022-04-23  本文已影响0人  萤火驻守心间

block内部能够修改的是堆中的内容, 但不能直接修改栈中的内容。若是加上__block 在运行时建立了一个外部变量的“副本”属性,把栈中的内存地址放到了堆中进而在block内部也能修改外部变量的值。

分析:
1、block 捕获的是当前在block内部执行的外部局部变量的瞬时值。其底层生成了一个和外部变量相同名称的属性值若是内部修改值,其实修改的是捕获以前的值,其捕获的内部的值因代码只作了一次捕获,并无作再一次的捕获,因此block里面不能够修改值。
2、若是当前捕获的为对象类型,其block内部能够认为从新建立了一个指向当前对象内存地址的指针(堆),操控内部操做的东西均为同一块内存地址,因此能够修改当前内部的对象里面的属性,可是不能直接修改当前的指针(没法直接修改栈中的内容)(即从新生成一个新的内存地址)。其原理和捕获基本数据类型一致。

上一篇下一篇

猜你喜欢

热点阅读