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