iOS底层学习-day-12
前言-OC-runtime篇
我是一名iOS开发者, iOS底层 菜鸟的进阶之路30天。
位运算
typedef enum {
// MJOptionsNone = 0, // 0b0000
MJOptionsOne = 1<<0, // 0b0001
MJOptionsTwo = 1<<1, // 0b0010
MJOptionsThree = 1<<2, // 0b0100
MJOptionsFour = 1<<3 // 0b1000
} MJOptions;
/*
0b0001
0b0010
|0b1000
------
0b1011
&0b0100
-------
0b0000
*/
- (void)setOptions:(MJOptions)options {
if (options & MJOptionsOne) {
NSLog(@"包含了MJOptionsOne");
}
if (options & MJOptionsTwo) {
NSLog(@"包含了MJOptionsTwo");
}
if (options & MJOptionsThree) {
NSLog(@"包含了MJOptionsThree");
}
if (options & MJOptionsFour) {
NSLog(@"包含了MJOptionsFour");
}
}
isa-类结构的窥探
- nonpointer
- 0,代表普通的指针,存储着Class、Meta-Class对象的内存地址
- 1,代表优化过,使用位域存储更多的信息
- has_assoc
- 是否有设置过关联对象,如果没有,释放时会更快
- has_cxx_dtor//有些类会自动插入析构函数
- 是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快
- shiftcls
- 存储着Class、Meta-Class对象的内存地址信息
- magic
- 用于在调试时分辨对象是否未完成初始化
- weakly_referenced
- 是否有被弱引用指向过,如果没有,释放时会更快
- deallocating
- 对象是否正在释放
- extra_rc
- 里面存储的值是引用计数器减1
- has_sidetable_rc
- 引用计数器是否过大无法存储在isa中
- 如果为1,那么引用计数会存储在一个叫SideTable的类的属性中
class_ro_t 和 class_rw_t
- 一开始类的所有信息在class_ro_t,然后才有class_rw_t
- class_rw_t里面的methods、properties、protocols是二维数组,是可读可写的,包含了类的初始内容、分类的内容
- class_ro_t里面的baseMethodList、baseProtocols、ivars、baseProperties是一维数组,是只读的,包含了类的初始内容
cache_t cache - 方法缓存
- cache_t cache
- 方法缓存,提高方法查找技术,是一种散列表缓存,用空间换时间的
- 方法缓存,提高方法查找技术,是一种散列表缓存,用空间换时间的
type encoding
-
SEL类型
- SEL代表方法函数名,一般叫做选择器,底层结构跟char *类似
- 可以通过@selector()和sel_registerName()获得
- 可以通过sel_getName()和NSStringFromSelector()转成字符串
- 不同类中相同名字的方法,所对应的方法选择器是相同的
-
为什么函数会是 “v 16 @ 0 :8”
-
验证方法 - 验证 v 16 @ 0 :8
NSLog(@"%s", @encode(@selector(test)));来验证
- 举例
// "i 24 @(self) 0 :(_cmd) 8 i 16 f 20” //24:所有参数的数
// 0 id 8 SEL 16 int 20 float == 24
- (int)test:(int)age height:(float)height;