美文网首页
_ _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的原理及测试

    最近刷面试题,刷到一篇大神的解析: 里面有一部分的内容,特别感兴趣,就记录下,也顺便做个测试,还有些疑惑,...

  • iOS Block __block说明符

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block存储域及循环引用 上一...

  • iOS Block存储域及循环引用

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block __block说明符...

  • Block用法及原理

    通过一个开红包按钮回传讲解一下简单block的用法 要实现的功能是通过点击红包,弹出效果图的红包框,点击拆红包回调...

  • Block的原理及使用

    1,Block的由来 学习任何一种知识,我们必须要了解他的由来,这样才能更好的接受和掌握。 Block是iOS4....

  • Block探究

    block的原理是怎样?本质是什么? block本质上也是一个OC对象,block是封装了函数调用与及调用环境的O...

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • iOS Block用法及原理

    //Block语法 //^返回值类型(参数列表){表达式} - (void)some{ ^int(int co...

  • iOS面试进阶篇(五)

    目录 block原理及使用多线程方式OC内存管理机制代理,通知的区别及使用场景宏const,const,exter...

  • iOS原理篇(五):Block探究

    Block原理 Block变量捕获 Block类型 copy操作和Block内部访问对象类型的变量 __block...

网友评论

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

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