一、分类(Category)
1、你用分类做了什么?
1)声明私有化方法
2)分解体积庞大的类文件
3)framework的私有方法公开化
2、分类的特点
1)运行时决议。分类是在运行时被添加到相应的宿主类上。
2)可以为系统类添加分类。
3、分类中可以添加哪些内容?
1)实例方法
2)类方法
3)协议
4)属性。只声明了对应的getter方法和setter方法,并没有添加对应的实例变量
4、给一个类添加分类A和分类B,A和B中有相同的类方法,最后AB两个分类中哪个方法会生效。
最后编译的分类中的方法最终生效。
注意:
如果分类和原有类中均重写了load方法,则原有类和分类中的load方法都会执行,会先执行原有类中的load方法,然后分类是最后编译的先执行
5、分类使用注意
1)分类添加的方法可以覆盖原类方法
2)同名分类方法生效取决于编译顺序
3)同名分类会引起编译报错
二、关联对象
1、能否为分类添加”成员变量“?
我们不能在分类的,声明或者定义实现的时候直接为分类添加成员变量,但是可以通过关联对象的方式来给分类添加成员变量。
关联对象主要方法:
1、objc_getAssociatedObject:
2、objc_setAssociatedObject:
3、objc_removeAssociatedObjects:
2、关联对象的本质
通过关联对象添加的成员变量没有添加到分类所对应的宿主类上,关联对象由AssociationsManger
管理并在AssociationsHashMap
存储。所有对象的关联内容都在同一个全局容器中
我们可以通过设置关联对象的值为nil来擦除(撤销)关联。
三、扩展(Extension)
1、扩展作用
1)声明私有属性
2)声明私有成员变量
3)声明私有方法
2、扩展的特点
1)在编译时决议
2)只以声明的形式存在,多数情况下寄生于宿主类的.m中
3)不能为系统类添加扩展
四、代理(delegate)
1、代理特点
1)是一种软件设计模式
2)iOS当中以@protocol形式体现。
3)传递方式一对一的
五、通知(NSNotification)
1、通知的特点
1)使用观察者模式来实现的用于跨层传递消息的机制
2)传递方式一对多
2、通知和代理的特点
1)代理是由代理模式实现的,而通知是使用观察者模式来实现的
2)代理的传递方式是一对一,通知传递是一对多
六、KVO(观察者设计模式)
1、什么是KVO
1)KVO是OC对观察者设计模式的一个实现
2)苹果使用了isa 混写来实现KVO
2、isa 混写技术在KVO中是怎样实现的?
当我们调用addObserver:forKeyPath:options:context
方法以后,系统会在运行时动态创建一个NSKVONtifying_A,同时将被观察者的isa指针指向新创建的类。新创建的类是原有被观察者类的子类。使用isa混写是为了重写新创建类的setter方法,来负责通知所有观察者对象。
注意:
NSKVONtifying_A类还重写了class方法,以保证动态创建类不被公开(封装性)
3、KVO 在什么情况下生效?
1)使用setter方法赋值
2)使用KVC方式赋值
3)成员变量赋值不能kvo不能生效,需要手动添加willChangeValueForKey:
方法和didChangeValueForKey:
方法来触发kvo
4、KVO 在多线程中的使用
在哪个线程中添加监听,在哪个线程中返回。在主线程添加在主线程返回监听结果,在子线程添加在子线程返回监听结果
七、KVC(键值编码)
1、什么是KVC
KVC 是键值编码,主要是通过valueForKey和setValueForKey来实现。