美文网首页
iOS 分类和扩展的作用和区别

iOS 分类和扩展的作用和区别

作者: 天空知诚 | 来源:发表于2020-04-17 16:23 被阅读0次
  • 分类即Category
    • 分类可以添加方法,也可以写添加属性,但是因为没有生成对应的成员变量和setter、getter方法,因此没有实际属性意义;
    • 分类里面不允许使用关键字@synthesize;
    • 将不同的功能分摊到不同的文件,减轻单个文件的体积;
    • 多人共同开发同一个类的不同分类,按需加载不同的分类;
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
};

从上面可以看出分类可以添加实例方法、类方法、协议、属性,但是不能添加实例变量。

  • 扩展即Extension
    • 为某个类附加额外的属性、成员变量以及方法声明,因为一般是依附于.m文件里面,所以一般都是私有变量,当然也可以单独作为一个文件存在.h文件里面;
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
    Class super_class                       OBJC2_UNAVAILABLE;  // 父类
    const char *name                        OBJC2_UNAVAILABLE;  // 类名
    long version                            OBJC2_UNAVAILABLE;  // 类的版本信息,默认为0
    long info                               OBJC2_UNAVAILABLE;  // 类信息,供运行期使用的一些位标识
    long instance_size                      OBJC2_UNAVAILABLE;  // 该类的实例变量大小
    struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  // 该类的成员变量列表
    struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定义的列表
    struct objc_cache *cache                OBJC2_UNAVAILABLE;  // 方法缓存
    struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  // 协议列表
#endif
} OBJC2_UNAVAILABLE;
  • extension是在编译器决定的,而category是在运行期决定的。
    在runtime 中,objc_class 结构体大小是固定的,不可能往这里添加数据,只能修改。所以,ivars 指向了一个固定区域,只能修改成员变量的值,不能增加成员变量的个数。方法列表是一个二维数组,可以修改 *methodLists的值来增加成员方法,虽然没办法扩展methodLists指向的内存区域,却可以改变这个内存区域的值(里面存的是指针),因此,可以动态添加方法,不可以添加成员变量。

相关文章

  • iOS 分类和扩展的作用和区别

    分类即Category分类可以添加方法,也可以写添加属性,但是因为没有生成对应的成员变量和setter、gette...

  • iOS面试题09- 基础篇

    《2018 iOS面试题系列》 1、category 和 extension 的区别 分类有名字,类扩展没有分类名...

  • iOS面试题积累总结

    iOS基础题 1. 分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员? 区别...

  • iOS基础题

    一、category 和 extension 的区别?(分类和扩展的区别) 1,分类有名字,类扩展没有名字,是一种...

  • iOS 中分类和扩展的区别

    在使用 OC 进行 iOS 开发的过程中,如一个类的方法不能满足我现在的要求,而又不想修改原类的结构,这是分类(c...

  • 分类和延展

    先说说类目和延展分别有什么作用和区别: 分类的作用: 是给没有.m文件的类扩展方法(如NSString类),不能添...

  • 分类和扩展的区别

    分类 category 给一个系统公用的类添加额外的方法时,使用category,生成NSObject+addit...

  • 分类和扩展的区别

    分类只能扩展方法,不能扩展属性和实例变量,如果包含成员变量会直接报错! 如果分类中声明了一个属性,那么分类中只会生...

  • 分类和扩展的区别

    1.分类:在不修改一个类的情况下给类增加方法,即在不知道.m的情况下给只能增加方法,但不能增加成员变量,可以添加属...

  • 网络上搜集的iOS面试题

    iOS基础题 1. 分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员? 分类...

网友评论

      本文标题:iOS 分类和扩展的作用和区别

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