美文网首页
分类和扩展

分类和扩展

作者: 晴川历历汉阳树丶 | 来源:发表于2020-05-11 14:27 被阅读0次

1.分类

分类的作用:
  • 可以为原类添加方法(也可以通过runtime的objc_setAssociatedObject和objc_getAssociatedObject方法作为属性的setter/getter方法来添加属性)
  • 重新创建一个文件来续写原类的内容,避免原类文件因为多功能造成代码量较大而显得比较臃肿。
  • 重写原类中的方法时,原类方法被覆盖,以分类方法为主。但是重写的时候系统会提示。
  • 多人开发的时候可以利用多文件改写一个类的方法来共同开发,互不影响。
  • 可以为原来添加私有的方法(或属性)。
分类的缺点:
  • 分类重写原类方法之后,优先级大于原类。原类方法被覆盖后,只能通过IMP指针进行原类的方法调用。
  • 可多处重写原类的同一个方法,并且由于它是运行时添加,所以会以最后一个运行的方法为准,不可控。
  • 只能通过runtime的方式添加属性变量。
  • 写在.h的是共有,.m的是私有。

2.扩展

扩展的作用:
  • 为原类添加属性和方法。
  • 功能分解,同一个类的不同功能可以通过分类的方式进行分开写,不同功能模块放到不同的扩展里面,条理清晰。
  • .m文件的@interface就是扩展的使用,为原类添加私有属性和方法。
  • .h的@interface是公有。
扩展的缺点:
  • 扩展的方法只能依赖原类去实现。
  • 不能为系统类添加扩展。

3.分类的结构体成员变量

struct category_t {
    const char *name;
    classref_t cls;
    struct method_list_t *instanceMethods;
    struct method_list_t *classMethods;
    struct protocol_list_t *protocols;
    struct property_list_t *instanceProperties;
    // Fields below this point are not always present on disk.
    struct property_list_t *_classProperties;

    method_list_t *methodsForMeta(bool isMeta) {
        if (isMeta) return classMethods;
        else return instanceMethods;
    }

    property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi);
    
    protocol_list_t *protocolsForMeta(bool isMeta) {
        if (isMeta) return nullptr;
        else return protocols;
    }
};

iOS的源码中 objc4-779.1直接搜索struct category_t可以找到。

相关文章

  • 分类和扩展

    1.分类1.1将一个复杂的类分成若干个模块儿,其中每个模块儿被称为一个分类1.2分类的作用是降低耦合度1.3语法1...

  • 分类和扩展

    1.分类 分类的作用: 可以为原类添加方法(也可以通过runtime的objc_setAssociatedObje...

  • 分类和扩展

    分类Category 分类是运行时动态决议的,扩展是编译期决议的。通过clang -rewrite-objc ma...

  • 分类和扩展

    一般用分类做什么? 1,声明私有方法 2,分解体积庞大的类文件 3,把framework的私有方法公开 分类的特点...

  • iOS知识基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • IOS知识基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • 1. iOS面试题基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • iOS面试题-基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • iOS面试题--基础篇

    category 和 extension 的区别 分类有名字,类扩展没有分类名字,是一种特殊的分类 分类只能扩展方...

  • 一些关键字的使用__weak,__block

    1、category 和 extension 的区别分类有名字,类扩展没有分类名字,是一种特殊的分类分类只能扩展方...

网友评论

      本文标题:分类和扩展

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