Category、类扩展

Category结构:
在这里插入图片描述
category_t的结构体中数据我们可以看到是不存在成员变量字段的,这也说明了在分类中是没办法添加成员变量的。

为什么在分类中是不能增加成员变量的?
主要原因是在class_rw_t的结构体中指向成员变量数组的指针是一个常量指针,指针常量有个特点就是指向可以改但是指向内容不可以改,所以不可以通过runtime的方式往成员变量数组中添加成员变量。

OC中的分类,类扩展和继承之间的关系

  • 在类扩展新添加方法不访问类的实例变量的情况下,可以不用import引入头文件的情况下使用。
  • 通过category 增加到类中的方法会被这个类的所有子类继承,就和此类的其它方法一样

分类实现原理:
分类编译之后的底层结构是struct category_t 里面存储着分类的对象方法,类方法,属性,协议信息;在程序运行的时候,runtime会将分类的数据合并到类信息中(类对象,元类对象中),将合并后的分类数据(方法、属性、协议),插入到类原来数据的前面。
分类的特点:
如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类。因此在开发中尽量不要覆盖原有类;
如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。

分类和类扩展的区别:

  1. 分类原则上只能增加方法,但是也可以通过关联属性增加属性(只是set、get方法)
  2. 拓展可以增加方法和属性,且都是私有的。
  3. 扩展只能在自身类中使用,而不是子类或者其他地方。
  4. 类扩展是在编译阶段将分类信息添加到类对象或者原类中,而分类是在运行时添加到类中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值