OC中的分类与扩展

2018-11-18  本文已影响13人  东也_

定义是什么就不说了...

他们能干嘛?

    分类:

    1、声明私有方法

    2、功能分解,当一个类很庞大的时候,可以使用分类分离一些功能。类似于如果一个函数里面有很长的代码的时候,就会将一些代码进行封装成其他函数进行调用。

    3、把framework的私有方法公开化。

    用法还是蛮多的,说一段实例:前两天我正在对公司项目的网络部分进行封装的时候,有一对象的函数在很多地方都用过了,但是后来发现这个方法,是需要根据环境进行不同方法的调用的。怎么办呢?我一不想改人家的封装,二是不想一个个去改。这个时候就用到了分类(这个分类当然就是针对那个类),在分类中重写load方法,用runtime将自己定义的方法和原对象方法进行交换,这样我就能在里面处理我自己的逻辑了。不过这种方法还是少用为好.....

扩展:

    1、声明私有属性

    2、声明私有方法

    3、声明成员变量

他们的区别是什么?

分类特点:

    1、运行时决议 ,就是在运行时才会为宿主类拼接内容

    2、可以为系统类添加分类

    3、可以添加实例方法、类方法、协议、属性(并不是实例变量 使用关联对象)

    ·多个分类的有同名方法,最后编译的方法会生效,因为源码中在添加方法的时候是倒序遍历的;

    ·分类方法会覆盖父类方法,其实覆盖并不是真正的覆盖,原类中的方法指针还是在的,可以通过IMP指针进行原类的方法调用。

扩展特点:

    1、编译时决议

    2、只能够声明,只能在宿主类中实现,一般都是放在宿主类的.m文件中。

    3、不能够为系统类添加扩展

怎样为分类添加成员变量?

    设计的方法有三个:

    //关联对象

    voidobjc_setAssociatedObject(id object, constvoid*key, id value, objc_AssociationPolicy policy)

    //获取关联的对象

    id objc_getAssociatedObject(id object, constvoid*key)

    //移除关联的对象

    voidobjc_removeAssociatedObjects(id object)    

 为分类添加的属性到底添加到哪了? 

   关联对象是由AssociationsManager全局单例进行管理 并在AssociationsHashMap存储,也就是所有对象的关联对象内容都放在了一个容器中。

 AssociationsManager -> AssociationsMap(key(selector) , value)-> AssociationsHashMap(key(object), value) 

上一篇下一篇

猜你喜欢

热点阅读