最近刷面试题,刷到一篇大神的解析:
里面有一部分的内容,特别感兴趣,就记录下,也顺便做个测试,还有些疑惑,等到再遇到大神的时候,希望可以请教一下~
知识点:
Block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针指向的内存地址。__block所起到的作用就是只要观察到该变量被block持有,就将外部变量的地址指针从栈中转移到堆中。(栈是红灯区,堆是绿灯区)。进而在block内部也可以修改外部变量的值了。
上代码。内容有点多,逐条分析。
第一:
__block修饰的基本数据类型及对象1.首先block1:
①a定义及赋值后,内容,及指针指向的内容地址为第一条打印,在栈区。
②当block定义后,a被copy进堆区。因为,a的内容没变,但是指针指向的内容地址变更到堆区。(区分地址在栈区请看)
③接下来,内容变更,地址不变。
④最后,内容未变更,地址未变更。
2.然后block2:
①a为对象类型,即指针。指针指向的地址及二级指针的地址为第一条。
②当block定义后,本身a存放于堆区,block拷贝a的指针。但是指向指针的指针地址,转移到栈区,是由于block的加持???(问题1)
③指针指向的地址变更,很好理解,就是内存写入新内容,指针指向新内容,但是由于指针未变,所以指向指针的指针地址不变。
④不变。
第二:
没有__block修饰的对象①a定义,存放于堆区。
②进入block,指针地址:只是拷贝a指向的地址,不变;
但是二级指针的地址由栈区变更到堆区。
③指针地址不变,但是内容发生改变,这是因为没有block修饰,a为指针,指针不能变,那么其实block内修改的是指针指向的内容。
且,二级指针的地址不变,仍在堆区。
④指针地址不变,二级指针地址回归栈区,是因为出了block???(问题2)
还有问题3,为什么二级指针地址在栈区,且第一个二级指针地址相同???
如果被看到的话,如果错误,希望可以被指出~
至于3个问题,等我遇到大神,我会请教。有答案会更新的。代码在git上。
网友评论