分类底层结构便是一个category_t
结构体,当咱们每创建一个分类,系统编译时就会把这个分类转化成这样一个结构体保存起来。当咱们在程序运行时,一切分类的这些特点办法等将会合并到类里边,分类的目标办法合并到类目标里边,分类的类办法合并到元类目标里边。合并进来的分类办法列表是放在数组的前面的,最终把一切分类的办法列表合并到原有类的办法列表前面,也便是说后编译的分类数据会在数组的前面,当咱们调用时会优先调用数组前面的办法,不管类何时编译,只需它有分类就会把分类的办法列表合并到类的办法列表前面,所以咱们调用时分类会掩盖类的办法
-
OC
的类能够多重承继么?能够完成多个接口么?Category
是什么?重写一个类的办法用承继好仍是分类好?为什么?
OC
的类不能够多重承继;能够完成多个接口,经过完成多个接口能够完结C++
的多重承继;Category
是类别,一般情况用分类好,用Category
去重写类的办法,仅对本Category
有效,不会影响到其他类与原有类的联系
-
Category
(分类),Extension
(扩展)和承继的差异
1.分类
category
原则上只能在现有类基础上增加新的办法(能增加特点的原因仅仅经过runtime
解决无setter/getter
的问题而已),类别中的办法没被完成编译器是不会有任何正告的,这是由于类别是在运行时增加到类中的
2.扩展
iOS
中的extension
便是匿名的分类,只要头文件没有完成文件。类扩展不只能够增加办法,还能够增加实例变量(或许特点),仅仅该实例变量默认是@private
类型的(使用范围只能在自身类,而不是子类或其他地方),类扩展中声明的办法没被完成,编译器会报警,这是由于类扩展是在编译阶段被增加到类中的
3.承继
在iOS
中承继是单承继,既只能有一个父类。在承继中,子类能够使用父类的办法和变量,当子类想对本类或许父类的变量进行初始化,那么需要重写init()
办法 。父类也能够拜访子类的办法和成员变量
-
Category
的完成原理,以及Category
为什么只能加办法不能加特点
分类的完成原理是将
category
中的办法、特点、协议数据放在category_t
结构体中,然后将结构体内的办法列表拷贝到原有类信息中。
Category
能够增加特点,可是并不会主动生成成员变量及set/get
办法。由于category_t
结构体中并不存在成员变量。经过之前对目标的剖析咱们知道成员变量是存放在实例目标中的,并且编译的那一刻就已经决议好了。而分类是在运行时才去加载的。那么咱们就无法在程序运行时将分类的成员变量增加到实例目标的结构体中。因此分类中不能够增加成员变量
-
Category
的加载处理过程
经过
Runtime
加载某个类的一切category
数据
把一切category
的办法、特点、协议数据合并到一个大数组中,后面参与编译的category
数据会在数组的前面
将合并后的分类数据(办法、特点、协议)刺进到类本来数据的前面
-
Category
中有load
办法吗?load
办法是什么时分调用的?load
办法能承继吗
Category
中有load
办法,load
办法在程序发动装载类信息的时分就会调用。load
办法能够承继。调用子类的load
办法之前,会先调用父类的load
办法
-
load、initialize
的差异,以及它们在category
重写的时分的调用的次第
差异在于调用办法和调用时间
调用办法:load
是根据函数地址直接调用,initialize
是经过objc_msgSend
调用
调用时间:load
是runtime
加载类、分类的时分调用(只会调用1次),initialize
是类第一次接收到消息的时分调用,每一个类只会initialize
一次(父类的initialize
办法或许会被调用屡次)
调用顺序:先调用类的load
办法,先编译那个类,就先调用load
。在调用load
之前会先调用父类的load
办法。分类中load
办法不会掩盖本类的load
办法,先编译的分类优先调用load
办法。initialize
先初始化父类,之后再初始化子类。假如子类没有完成+initialize
,会调用父类的+initialize
(所以父类的+initialize
或许会被调用屡次),假如分类完成了+initialize
,就掩盖类自身的+initialize
调用
- 用
runtime
能够完成分类增加成员变量,那这个成员变量是保存在哪里呢?是合并到类里边吗?
答案不是的。
runtime
为这个分类的相关目标独自进行办理,并不是合并到原有类里边。其实runtime
是生成一个AssociationsManager
类用来办理分类的相关目标,AssociationsManager
类有一个AssociationsHashMap
特点,这个特点适当于一个字典,用来存储目标-相关目标
的,它的key
是相关目标也便是这个分类,然后value
是一个ObjectAssociationMap
也适当所以一个字典,这个字典的key
是相关目标时传进去的那个key
,value
是ObjcAssociation
,里边有两个特点_value
和_policy
,这两个便是相关目标的值和相关战略