美文网首页
面试题小结整理

面试题小结整理

作者: 上帝是个女孩丶 | 来源:发表于2017-06-16 11:05 被阅读9次

能否想编译后的类中添加实例变量,能否像运行时创建的类添加实例变量?为什么?

不能向编译后得到的类增加实例变量,能向运行时创建的类中添加实例变量

解释:

编译后的类已经注册在runtime中,类结构体中的objc_ivar_list实例变量的链表和instance_size实例变量的内存大小已经确定,runtime会调用class_setvarlayout或class_setWeaklvarLayout来处理strong,weak引用.所以不能向存在的类中添加实例变量

2.运行时创建的类是可以添加实例变量,调用class_addIvar函数.但是的在调用objc_allocateClassPair之后,objc_registerClassPair之前,原因同上.

为什么不使用__block就不能在Block内部修改外部的局部变量?

我们注意到Block实质被转换成了一个__main_block_impl_0的结构体实例,其中__main_block_impl_0结构体的成员包括局部变量val。在__main_block_impl_0结构体的构造方法中,val作为第三个参数传递进入。

但执行我们的Block时,通过block找到Block对应的方法执行部分__main_block_func_0,并把当前block作为参数传递到__main_block_func_0方法中。

那么,为什么这个时候不能给val进行赋值呢?

因为main函数中的局部变量val和函数__main_block_func_0不在同一个作用域中,调用过程中只是进行了值传递。当然,在上面代码中,我们可以通过指针来实现局部变量的修改。不过这是由于在调用__main_block_func_0时,main函数栈还没展开完成,变量val还在栈中。但是在很多情况下,block是作为参数传递以供后续回调执行的。通常在这些情况下,block被执行时,定义时所在的函数栈已经被展开,局部变量已经不在栈中了(block此时在哪里?),再用指针访问就……

所以,对于auto类型的局部变量,不允许block进行修改是合理的

相关文章

  • 面试题小结整理

    能否想编译后的类中添加实例变量,能否像运行时创建的类添加实例变量?为什么? 不能向编译后得到的类增加实例变量,能向...

  • 2017 Android 面试题分享整理

    第174期:2017 Android 面试题分享整理 深度讨论 2017 Android 面试题分享整理 (欢迎评...

  • 面试题

    关注的面试题文集 Android面试题整理 Android工程师面试题大全 Android 面试题总结之Andro...

  • 日记-2020-07-27

    早上:学习vim中午:休息白天: 配合测试 修改批量查询bug 整理面试题-多线程2 整理面试题-JVM部分 待完成

  • Android面试总结二

    参考文章 40个Android面试题Java面试题集Android名企面试题及知识点整理Android面试题收集较...

  • 经典面试100题 - 持续更新中

    打算整理100道经典面试题,整理出来的链接都会附录在下面。 经典面试题1:图片占多少内存经典面试题2:时针和分针经...

  • python面试题整理

    python面试题整理 110道Python面试题(真题)[https://zhuanlan.zhihu.com/...

  • 2019年Android岗位BAT等大厂面试题知识点小结

    2019年Android岗位BAT等大厂面试题知识点小结 2019年了搜集了很多面试题,希望能对大家有所帮助 1....

  • 作者心血 整理阿里p4-p6面试题(附带答案)

    前面已经看过我整理的187到面试题合集 最近收集阿里p4-p6面试题整理,筛选比较大众一点的25到面试题(ps:附...

  • 整理阿里p4-p6面试题(附带答案)

    前面已经看过我整理的187到面试题合集 最近收集阿里p4-p6面试题整理,筛选比较大众一点的25到面试题(ps:附...

网友评论

      本文标题:面试题小结整理

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