美文网首页
_ _block的原理及测试

_ _block的原理及测试

作者: 向小暖_he | 来源:发表于2019-03-20 19:48 被阅读0次

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

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

    知识点:

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

    相关文章

      网友评论

          本文标题:_ _block的原理及测试

          本文链接:https://www.haomeiwen.com/subject/rsbzmqtx.html