OC中语言特性相关

2019-03-24  本文已影响0人  TAsama

1. 分类

你用分类都做了哪些事?
特点
分类中可以添加哪些内容

在加载中,系统会读取镜像加载分类文件并关联到他的宿主类中。


系统加载分类

加载中,分类的方法会“覆盖”原生类的方法,这里的覆盖并不是真正意义上的覆盖,而是将原类的方法在内存指针中后移,而分类方法会前移。不同分类所添加的同方法名的方法也会根据编译顺序而互相覆盖,最后被编译的分类方法将会“覆盖”掉之前编译的分类。
由于编译时,分类所拥有的方法会根据分类的名称对应存储在一个数组中,所以相同的分类名会造成编译时的报错。

关联对象

能否给分类添加“成员变量”,答案是肯定的。
在分类中使用关联对象,可以使分类具有成员变量的效果。
关联对象由AssociationsManager管理并在AssociationsHashMap储存。
所有对象的关联内容都在同一个全局容器中。

关联对象存储关系
关联对象保存了需要关联实例的值,和引用规则,并使用键Key来指向关联对象,被关联对象作为key又指向了他自身的关联表。

2. 扩展(Extension)

一般用扩展做什么?
特点

3. 代理

比较简单,一图流


代理

4. 通知

如何实现通知机制?

可以使用map的方式,Key为通知名称,Value为注册了通知的对象模型,模型中包括了通知的监听者对象,以及监听通知的SEL,监听通知的object参数
一图流:


通知

5. KVO

这里提到的isa混写模式就是指,注册KVO的时候,系统会动态创建一个被观察对象的子类,然后令被观察对象的isa指针指向该子类,在该子类中重写了setter方法。这样,当原对象属性被修改时(基于KVC的修改),就会调用setter方法,然后通知观察者。


KVO
如何实现手动KVO?
- (void)setValue:(id)obj {
  [self willChangeValueForKey:@"keyPath"];
  [super setValue:obj];
  [self didChangeValueForKey:@"keyPath"];
}

6. KVC

先看图


KVC系统调用流程

可以看到,系统先回盘对有没有对应setter getter方法,如果有则直接执行,如果没有则判断有没有对应的实例变量,如果有则执行实例变量的赋值,没有则会抛出异常。

Accessor Method方法包括
Instance var包括了
上一篇下一篇

猜你喜欢

热点阅读