OC中语言特性相关

1. 分类

你用分类都做了哪些事?
  • 声明私有方法
  • 分解体积庞大的文件
  • 把framework的私有方法公开
特点
  • 运行时决议(区别于扩展的第一个特点, 扩展是编译时决定)
  • 可以为系统类添加分类
分类中可以添加哪些内容
  • 实例方法
  • 类方法
  • 协议
  • 属性


    分类的结构体

    可以看到,分类结构体中会引用其实例对象,类对象,协议以及实例属性的列表。

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


系统加载分类

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

关联对象

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

关联对象存储关系

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

2. 扩展(Extension)

一般用扩展做什么?
  • 声明私有属性
  • 声明私有方法
  • 声明私有成员变量
特点
  • 编译时决议
  • 只以生命的形式存在,多数情况下寄生于宿主类的.m中
  • 不能为系统类添加扩展

3. 代理

比较简单,一图流


OC中语言特性相关_第1张图片
代理

4. 通知

  • 是使用观察者模式来实现的用于跨层传递消息的机制
  • 传递方式为一对多
如何实现通知机制?

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


OC中语言特性相关_第2张图片
通知

5. KVO

  • KVO是Key-value observing的缩写
  • KVO是Objective-C对观察者设计模式的又一实现。
  • Apple使用了isa混写来实现KVO

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


OC中语言特性相关_第3张图片
KVO
如何实现手动KVO?
- (void)setValue:(id)obj {
  [self willChangeValueForKey:@"keyPath"];
  [super setValue:obj];
  [self didChangeValueForKey:@"keyPath"];
}

6. KVC

先看图


OC中语言特性相关_第4张图片
KVC系统调用流程

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

Accessor Method方法包括
Instance var包括了
  • _key
  • _isKey

你可能感兴趣的:(OC中语言特性相关)