_ _block的原理及测试

2019-03-20  本文已影响0人  向小暖_he

    最近刷面试题,刷到一篇大神的解析:

    里面有一部分的内容,特别感兴趣,就记录下,也顺便做个测试,还有些疑惑,等到再遇到大神的时候,希望可以请教一下~

知识点:

    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上。

上一篇下一篇

猜你喜欢

热点阅读