OC对象 - Category(分类)

OC对象 - Category(分类)

1. Category的底层结构

位于objc-runtime-new.h

从底层结构可以看出

  • 分类中有实例方法类方法列表
  • 没有成员变量(ivar),因此不能给分类添加成员变量
  • 在分类里面声明的属性,不会自动生成 get/set 方法,除非使用关联对象(后续会讲)

2. Category的实现原理

  • Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息
  • 在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)

2. Category的加载处理过程

  • 通过Runtime加载某个类的Category数据
  • 把所有Category的方法、属性、协议数据,合并到一个大数组中
    • 后面参与编译的Category数据,会在数组的前面
  • 将合并后的分类数据(风格发、属性、协议),插入到类原来数据的前面

2.1 重点:数据和合并

我们有必要记住这个分类数据的合并顺序,下面将通过示例代码来验证

2.1.1 某个类仅有一个分类的时

假设我们有ZSXPerson类,其中有sayHello方法,有一个ZSXPerson的分类,ZSXPerson+Test,重写了sayHello方法

  • 所有分类数据会先合并到一个大数组中,再插入到原来数据的前面
  • 此时分类如果重写了父类的方法,最后调用方法都会优先找到分类的方法实现来调用。(相当于覆盖掉父类的方法)

2.1.2 某个类有多个分类的时

假设有多个ZSXPerson的分类,他们都重写了sayHello方法

  • 所有分类数据会先合并到一个大数组中,再插入到原来数据的前面,分类按照编译顺序,先编译的分类数据在后面后编译的分类数据在前面,再插入到原来数据的前面
  • 这时候sayHello方法优先被找到的应该是最后一个被编译的分类的方法实现

这是当前的类文件,将按从上往下的顺序

最后一个编译的类是ZSXPerson+Test,所以运行时sayHello应该要调用ZSXPerson+Test的方法实现

2.1.3 调整编译顺序

可以拖动这个列表,来调整类的编译顺序,此时我们把ZSXPerson+66类调整到最下面

可以看到,此时sayHello调用的是ZSXPerson+66的方法实现

@oubijiexi

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值