分类底层结构便是一个category_t结构体,当咱们每创建一个分类,系统编译时就会把这个分类转化成这样一个结构体保存起来。当咱们在程序运行时,一切分类的这些特点办法等将会合并到类里边,分类的目标办法合并到类目标里边,分类的类办法合并到元类目标里边。合并进来的分类办法列表是放在数组的前面的,最终把一切分类的办法列表合并到原有类的办法列表前面,也便是说后编译的分类数据会在数组的前面,当咱们调用时会优先调用数组前面的办法,不管类何时编译,只需它有分类就会把分类的办法列表合并到类的办法列表前面,所以咱们调用时分类会掩盖类的办法

  1. OC的类能够多重承继么?能够完成多个接口么?Category是什么?重写一个类的办法用承继好仍是分类好?为什么?

OC的类不能够多重承继;能够完成多个接口,经过完成多个接口能够完结C++的多重承继;Category是类别,一般情况用分类好,用Category去重写类的办法,仅对本Category有效,不会影响到其他类与原有类的联系

  1. Category(分类),Extension(扩展)和承继的差异

1.分类
category原则上只能在现有类基础上增加新的办法(能增加特点的原因仅仅经过runtime解决无setter/getter的问题而已),类别中的办法没被完成编译器是不会有任何正告的,这是由于类别是在运行时增加到类中的
2.扩展
iOS中的extension便是匿名的分类,只要头文件没有完成文件。类扩展不只能够增加办法,还能够增加实例变量(或许特点),仅仅该实例变量默认是@private类型的(使用范围只能在自身类,而不是子类或其他地方),类扩展中声明的办法没被完成,编译器会报警,这是由于类扩展是在编译阶段被增加到类中的
3.承继
iOS中承继是单承继,既只能有一个父类。在承继中,子类能够使用父类的办法和变量,当子类想对本类或许父类的变量进行初始化,那么需要重写init()办法 。父类也能够拜访子类的办法和成员变量

  1. Category的完成原理,以及Category为什么只能加办法不能加特点

分类的完成原理是将category中的办法、特点、协议数据放在category_t结构体中,然后将结构体内的办法列表拷贝到原有类信息中。
Category能够增加特点,可是并不会主动生成成员变量及set/get办法。由于category_t结构体中并不存在成员变量。经过之前对目标的剖析咱们知道成员变量是存放在实例目标中的,并且编译的那一刻就已经决议好了。而分类是在运行时才去加载的。那么咱们就无法在程序运行时将分类的成员变量增加到实例目标的结构体中。因此分类中不能够增加成员变量

  1. Category的加载处理过程

经过Runtime加载某个类的一切category数据
把一切category的办法、特点、协议数据合并到一个大数组中,后面参与编译的category数据会在数组的前面
将合并后的分类数据(办法、特点、协议)刺进到类本来数据的前面

  1. Category中有load办法吗?load办法是什么时分调用的?load办法能承继吗

Category中有load办法,load办法在程序发动装载类信息的时分就会调用。load办法能够承继。调用子类的load办法之前,会先调用父类的load办法

  1. load、initialize的差异,以及它们在category重写的时分的调用的次第

差异在于调用办法和调用时间
调用办法:load是根据函数地址直接调用,initialize是经过objc_msgSend调用
调用时间:loadruntime加载类、分类的时分调用(只会调用1次),initialize是类第一次接收到消息的时分调用,每一个类只会initialize一次(父类的initialize办法或许会被调用屡次)
调用顺序:先调用类的load办法,先编译那个类,就先调用load。在调用load之前会先调用父类的load办法。分类中load办法不会掩盖本类的load办法,先编译的分类优先调用load办法。initialize先初始化父类,之后再初始化子类。假如子类没有完成+initialize,会调用父类的+initialize(所以父类的+initialize或许会被调用屡次),假如分类完成了+initialize,就掩盖类自身的+initialize调用

  1. runtime能够完成分类增加成员变量,那这个成员变量是保存在哪里呢?是合并到类里边吗?

答案不是的。runtime为这个分类的相关目标独自进行办理,并不是合并到原有类里边。其实runtime是生成一个AssociationsManager类用来办理分类的相关目标,AssociationsManager类有一个AssociationsHashMap特点,这个特点适当于一个字典,用来存储目标-相关目标的,它的key是相关目标也便是这个分类,然后value是一个ObjectAssociationMap也适当所以一个字典,这个字典的key是相关目标时传进去的那个keyvalueObjcAssociation,里边有两个特点_value_policy,这两个便是相关目标的值和相关战略