iOS 类扩展
2021-05-25 本文已影响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
文件