美文网首页
iOS底层面试题---OC语法部分

iOS底层面试题---OC语法部分

作者: 纳兰沫 | 来源:发表于2019-01-22 16:25 被阅读7次

非作者原著 来自摘抄

参考文献

ptlCoder

一个NSObject对象占用多少内存

- 系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
- 但是NSObject对象内部只使用了8个字节的空间(64bit环境下 可以通过
class_getInstanceSize函数获得)

对象的isa指针指向哪里

- instance 对象的isa指向class对象
- class 对象的isa指向meta-class对象
- meta-class 对象的isa指向基类的meta-class对象

OC的类信息存放在哪里

- 对象方法 属性 成员变量 协议信息 存放在class对象中
- 类方法 存放在meta-class对象中
- 成员变量的具体值 存放在instance对象中

Category 和Class Extension的区别是什么

- Class Extension在编译的时候 它的数据就已经包含在类信息中
- Category是在运行时 才会将数据合并到类信息中

Category 中有load方法吗 load方法是什么时候调用的 load能继承吗

- 有load方法
- load方法在runtime加载类 分类的时候调用
- load方法可以继承 但是一般情况下不会主动去调用load方法 都是让系统
自动调用

+load +initialize方法的区别是什么 它们在category中的调用顺序 以及出现继承时它们之间的调用过程

load 
1. +load会在runtime加载类 分类时调用
2. 每个类 分类的+load 在程序运行过程中只调用一次
2. 调用顺序
   - 先调用类的+load
     按照编译先后顺序调用(先编译 先调用)
     调用子类的+load之前会先调用父类的+load
   - 再调用分类的+load
     按照编译先后顺序调用(先编译 先调用)
+initialize 
1. +initialize 方法会在类第一次接收到消息时调用
2. 调用顺序
   - 先调用父类的+initialize 再调用子类的+initialize
   - (先初始化父类 再初始化子类 每个类只会初始化一次)
+initialize 和+load 的很大区别是 +initialize 是通过objc_msgSend
进行调用的 所以 有以下特点
- 如果子类没有实现 +initialize 会调用父类的+initialize(所以 
父类的+initialize可能会被调用多次)
- 如果分类实现了+initialize 就覆盖类本身的+initialize调用

__block的作用是什么

1.__block说明符类似static auto register一样 只要观察到该变量被
block所持有 就将"外部变量"在栈中的内存地址放到堆中 进而在block内部也
可以修改外部变量的值
2.__block可以用于解决block内部无法修改auto变量值的问题
3.__block不能修饰全局变量 静态变量
4.编译器会将__block变量包装成一个对象

相关文章

网友评论

      本文标题:iOS底层面试题---OC语法部分

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