OC笔记 - 分类底层原理(objc4-818.2)
分类底层原理
1 - category源码如图:不难发现在分类里面 -\+方法、协议、属性都存在,但是少了 IVARS(成员变量)
2 - 分类是如何实现的
① 我们知道 APP就是通过 DYLD启动的,runtime启动入口在 objc-os.mm文件中的 _objc_init函数
② 这里我们进入 map_images函数,来到 _read_images
_read_images中找到分类,发现调用了 load_categories_nolock
③ 进入 load_categories_nolock函数找到 attachCategories,我们会发现其传进的参数是个列表
通过下面的代码我们就大致清楚了 attachCategories的功能
④ 进入 attachLists函数:其实就是为分类中的方法追加了一块新的内存空间,并把分类中的方法拼进原类的方法列表中
分析图:原类对象中的方法列表后移,新增分类中的方法列表移进了空出的位置。与其说分类方法会覆盖原类中的方法,倒不如说是新增的分类方法占据了原类方法的起始位置,这就是优先调用分类中方法的原因
结语
1 - 分类实现原理
① 程序启动、编译后,Runtime会进行初始化,首先调用 _objc_init,其中走 map_images
② 接下来调用 map_images_nolock,再然后就是 read_images,这个方法会读取所有的类的相关信息
③ 接着调用 load_categories_nolock。其函数内部会调用 attachCategories,它传入 Class和 Category,最终会将方法列表、协议列表、属性列表等与原有的类合并(就是加入到 rwe结构体中)