分类和扩展

2020-05-11  本文已影响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可以找到。

上一篇 下一篇

猜你喜欢

热点阅读