iOS 类扩展

作者: 木扬音 | 来源:发表于2021-05-25 22:06 被阅读0次

    类扩张和分类的区别

    1、category类别、分类

    • 专门用来给类添加新方法
    • 不能添加成员属性,添加了也不能娶到
    • 可以通过runtime 给分类添加属性,即使属性关联,重写setter、getter方法
    • 使用@property定义变量,只会生成setter、getter方法的声明,不能生成方法的实现和下划线成员变量

    2、extension类扩展

    • 特殊分类(匿名分类)
    • 给类添加成员属性(私有变量)
    • 给类添加方法(私有方法)

    类扩展 的底层探索

    有两种创建类扩展的方式

    • 直接在类中书写(在.m文件中,在声明之后,实现之前)
    • 通过command+N新建 Objective-C File 选择Extension
      类扩展的创建

    类扩展的本质

    clang底层编译

    • 创建一个类扩展


      创建类扩展
    • 通过clang -rewrite-objc main.m -o main.cpp命令生成cpp文件并打开,搜索ext_name属性

      clang底层编译
    • 查看LGTeacher类扩展的方法,在编译过程中,方法就直接添加到methodlist中,作为类的一部分

      clang底层编译

    通过源码调试探索

    • 创建类扩展 LGPerson+LGEXT.h,并声明两个方法,在LGPerson.m中实现这两个方法

      源码调试
    • 运行objc源码程序,在readClass中下一个断点,查看kc_ro

      源码调试
    • 在控制台中p kc_ro->baseMethodList --> p $0->get(0) ~ p $0->get(10)

      源码调试

    总结

    • 类扩展在编译时期会作为类的一部分,和类一起编译进来
    • 类扩展只是声明,依赖于当前的主类,没有.m文件,可以理解为一个.h文件

    相关文章

      网友评论

        本文标题:iOS 类扩展

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