美文网首页
OC中语言特性相关

OC中语言特性相关

作者: TAsama | 来源:发表于2019-03-24 15:48 被阅读0次

    1. 分类

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


      分类的结构体

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

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


    系统加载分类

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

    关联对象

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

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

    2. 扩展(Extension)

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

    3. 代理

    比较简单,一图流


    代理

    4. 通知

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

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


    通知

    5. KVO

    • KVO是Key-value observing的缩写
    • KVO是Objective-C对观察者设计模式的又一实现。
    • Apple使用了isa混写来实现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方法包括
    • <getKey>
    • <key>
    • <isKey>
    Instance var包括了
    • _key
    • _isKey

    相关文章

      网友评论

          本文标题:OC中语言特性相关

          本文链接:https://www.haomeiwen.com/subject/wwsuvqtx.html