非作者原著 来自摘抄
参考文献
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变量包装成一个对象
网友评论