ios八股文 -- Objective-c
分类
1. 声明私有方法
2. 分解体积庞大的类文件
3. 把Framework的私有方法公开化
特点:
运行时决议
为系统类添加分类:不能给系统类添加扩展
分类中可以添加的内容
1. 实例方法
2.类方法
3.协议
4.属性:声明的对应的get和set方法,并没有添加实例变量
分类的加载
编译时倒序遍历,最先访问最后编译的分类,也就是最后编译的分类中的方法会生效
并且分类方法会覆盖宿主类方法,因为我们时根据选择器名称查找的吗,并且找到第一个就返回,所以宿主类方法依然存在,但是被覆盖
关联对象
该方法用来给分类添加成员变量
objc_setAssociatedObject
- 为对象设置关联值objc_getAssociatedObject
- 获取对象的关联值objc_removeAssociatedObjects
- 移除对象的所有关联值
设置关联对象时需要指定内存管理策略,常用的有:
OBJC_ASSOCIATION_ASSIGN
- 弱引用(类似 assign)OBJC_ASSOCIATION_RETAIN_NONATOMIC
- 强引用,非原子性(类似 strong, nonatomic)OBJC_ASSOCIATION_COPY_NONATOMIC
- 复制,非原子性(类似 copy, nonatomic)
关联对象的本质
其核心是通过全局哈希表来动态维护对象与附加数据的关联关系。
全局哈希表:由objc_association_manager
管理,键是被关联的对象(id),值是该对象对应的objc_association_map
(即该对象的所有关联属性集合)
扩展
声明私有属性
声明私有方法
声明私有成员变量
特点
编译时决议
只以声明的形式存在,多数情况下寄生于宿主类的.m文件中
不能为系统类添加扩展
代理
一种软件设计模式
传递方式为1对1
一般以weak以规避循环引用
通知
使用观察者模式来实现的用于跨层传递消息的机制
传递方式为一对多
在通知中心存在一个map,存在通知名称和观察者列表的映射
KVO
key value observing
观察者设计模式的又一实现,使用来isa混写机制来实现
当我们调用addobserver这个方法的时候,系统会为我们动态创建NSKVONotifying_A这个类(继承A,重写setter方法),然后将原来类A的isa指针指向这个新的类
通过kvc设置value会使value生效
但是通过成员变量直接赋值不会使value生效,但是我们可以添加willchange或者didchange实现手动KVO实现