美文网首页
OC中的分类与扩展

OC中的分类与扩展

作者: 东也_ | 来源:发表于2018-11-18 11:45 被阅读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) 

    相关文章

      网友评论

          本文标题:OC中的分类与扩展

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