category的面试题和底层结构

15 篇文章 0 订阅

Category的使用场合是什么?

Category的实现原理

Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息

在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)

Category和Class Extension的区别是什么?

Class Extension在编译的时候,它的数据就已经包含在类信息中

Category是在运行时,才会将数据合并到类信息中

Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?

有load方法

load方法在runtime加载类、分类的时候调用

load方法可以继承,但是一般情况下不会主动去调用load方法,都是让系统自动调用

load、initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?

load、initialize方法的区别什么?

1.调用方式

1> load是根据函数地址直接调用

2> initialize是通过objc_msgSend调用

2.调用时刻

1> load是runtime加载类、分类的时候调用(只会调用1次)

2> initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次)

load、initialize的调用顺序?

1.load

1> 先调用类的load

a) 先编译的类,优先调用load

b) 调用子类的load之前,会先调用父类的load

2> 再调用分类的load

a) 先编译的分类,优先调用load

2.initialize

1> 先初始化父类

2> 再初始化子类(可能最终调用的是父类的initialize方法)

Category能否添加成员变量?如果可以,如何给Category添加成员变量? 不能直接给Category添加成员变量,但是可以间接实现Category有成员变量的效果

Category的底层结构

定义在objc-runtime-new.h中

 Category的加载处理过程

1. 通过Runtime加载某个类的所有Category数据

2.把所有Category的方法、属性、协议数据,合并到一个大数组中 后面参与编译的Category数据,会在数组的前面

3.将合并后的分类数据(方法、属性、协议),插入到类原来数据的前面

源码解读顺序

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值