iOS category内部实现原理

iOS category内部实现原理

Objective-C 2.0,新增的语言特性,可以为已有类添加新行为;

在编译期完成的事情:生成category本身;生成实例方法列表和属性方法列表等,完成category的初始化;生成category数组

在运行期完成的事情:category被附加到类上面;1)、把category的实例方法、协议以及属性添加到类上;2)、把category的类方法和协议添加到类的metaclass上

需要注意的有两点:
1)、category的方法没有“完全替换掉”原来类已经有的方法,也就是说如果category和原来类都有methodA,那么category附加完成之后,类的方法列表里会有两个methodA
2)、category的方法被放到了新方法列表的前面,而原来类的方法被放到了新方法列表的后面,这也就是我们平常所说的category的方法会“覆盖”掉原来类的同名方法,这是因为运行时在查找方法的时候是顺着方法列表的顺序查找的,它只要一找到对应名字的方法,就会罢休^_^,殊不知后面可能还有一样名字的方法。

extension可以添加实例变量,而category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。

但是关联对象又是存在什么地方呢? 如何存储? 对象销毁时候如何处理关联对象呢?

我们可以看到所有的关联对象都由AssociationsManager管理,而AssociationsManager定义如下:

AssociationsManager里面是由一个静态AssociationsHashMap来存储所有的关联对象的。这相当于把所有对象的关联对象都存在一个全局map里面。而map的的key是这个对象的指针地址(任意两个不同对象的指针地址一定是不同的),而这个map的value又是另外一个AssociationsHashMap,里面保存了关联对象的kv对。
而在对象的销毁逻辑里面,见objc-runtime-new.mm:

runtime的销毁对象函数objc_destructInstance里面会判断这个对象有没有关联对象,如果有,会调用_object_remove_assocations做关联对象的清理工作。

https://tech.meituan.com/DiveIntoCategory.html

main()之前的过程有哪些?

整个事件由dyld主导,完成运行环境的初始化后,配合ImageLoader将二进制文件按格式加载到内存,
动态链接依赖库,并由runtime负责加载成objc定义的结构,所有初始化工作结束后,dyld调用真正的main函数。
值得说明的是,这个过程远比写出来的要复杂,这里只提到了runtime这个分支,还有像GCDXPC等重头的系统库初始化分支没有提及(当然,有缓存机制在,它们也不会玩命初始化),总结起来就是main函数执行之前,系统做了茫茫多的加载和初始化工作,但都被很好的隐藏了,我们无需关心。

https://blog.csdn.net/guojin08/article/details/48527743

实现 isEqual 和 hash 方法时要注意什么?

https://www.jianshu.com/p/915356e280fc

线程安全的处理手段有哪些?

http://www.cocoachina.com/ios/20160707/16957.html

iOS 设计模式

https://www.cnblogs.com/wangbinios/p/7882082.html

Swift 是如何实现多态的?

https://www.cnblogs.com/taoxu/p/5320496.html

编译的时候他表现的是FatherClass类型的方法,但是在运行的时候,它表现的是运行时候的方法。这就是多态,一个引用变量,调用同一个方法myname时,表现出多种形态就是多态。

SDWebImage原理和缓存机制

https://www.jianshu.com/p/7dea5b081d24 

https://www.jianshu.com/p/c245f409c74b

原文地址:https://www.cnblogs.com/dengchaojie/p/8907416.html