iOS Category

分类底层结构就是一个category_t结构体,当我们每创建一个分类,系统编译时就会把这个分类转化成这样一个结构体保存起来。当我们在程序运行时,所有分类的这些属性方法等将会合并到类里面,分类的对象方法合并到类对象里面,分类的类方法合并到元类对象里面。合并进来的分类方法列表是放在数组的前面的,最后把所有分类的方法列表合并到原有类的方法列表前面,也就是说后编译的分类数据会在数组的前面,当我们调用时会优先调用数组前面的方法,不管类何时编译,只要它有分类就会把分类的方法列表合并到类的方法列表前面,所以我们调用时分类会覆盖类的方法

  1. OC的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

OC的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系

  1. Category(分类),Extension(扩展)和继承的区别

1.分类 category原则上只能在现有类基础上添加新的方法(能添加属性的原因只是通过runtime解决无setter/getter的问题而已),类别中的方法没被实现编译器是不会有任何警告的,这是因为类别是在运行时添加到类中的 2.扩展 iOS中的extension就是匿名的分类,只有头文件没有实现文件。类扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型的(使用范围只能在自身类,而不是子类或其他地方),类扩展中声明的方法没被实现,编译器会报警,这是因为类扩展是在编译阶段被添加到类中的 3.继承 在iOS中继承是单继承,既只能有一个父类。在继承中,子类可以使用父类的方法和变量,当子类想对本类或者父类的变量进行初始化,那么需要重写init()方法 。父类也可以访问子类的方法和成员变量

  1. Category的实现原理,以及Category为什么只能加方法不能加属性

分类的实现原理是将category中的方法、属性、协议数据放在category_t结构体中,然后将结构体内的方法列表拷贝到原有类信息中。 Category可以添加属性,但是并不会自动生成成员变量及set/get方法。因为category_t结构体中并不存在成员变量。通过之前对对象的分析我们知道成员变量是存放在实例对象中的,并且编译的那一刻就已经决定好了。而分类是在运行时才去加载的。那么我们就无法在程序运行时将分类的成员变量添加到实例对象的结构体中。因此分类中不可以添加成员变量

  1. Category的加载处理过程

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

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

Category中有load方法,load方法在程序启动装载类信息的时候就会调用。load方法可以继承。调用子类的load方法之前,会先调用父类的load方法

  1. load、initialize的区别,以及它们在category重写的时候的调用的次序

区别在于调用方式和调用时刻 调用方式:load是根据函数地址直接调用,initialize是通过objc_msgSend调用 调用时刻:loadruntime加载类、分类的时候调用(只会调用1次),initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次) 调用顺序:先调用类的load方法,先编译那个类,就先调用load。在调用load之前会先调用父类的load方法。分类中load方法不会覆盖本类的load方法,先编译的分类优先调用load方法。initialize先初始化父类,之后再初始化子类。如果子类没有实现+initialize,会调用父类的+initialize(所以父类的+initialize可能会被调用多次),如果分类实现了+initialize,就覆盖类本身的+initialize调用

  1. runtime可以实现分类添加成员变量,那这个成员变量是保存在哪里呢?是合并到类里面吗?

答案不是的。runtime为这个分类的关联对象单独进行管理,并不是合并到原有类里面。其实runtime是生成一个AssociationsManager类用来管理分类的关联对象,AssociationsManager类有一个AssociationsHashMap属性,这个属性相当于一个字典,用来存储对象-关联对象的,它的key是关联对象也就是这个分类,然后value是一个ObjectAssociationMap也相当于是一个字典,这个字典的key是关联对象时传进去的那个keyvalueObjcAssociation,里面有两个属性_value_policy,这两个就是关联对象的值和关联策略

相关推荐
cs_dn_Jie17 分钟前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic1 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿1 小时前
webWorker基本用法
前端·javascript·vue.js
cy玩具2 小时前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
qq_390161772 小时前
防抖函数--应用场景及示例
前端·javascript
John.liu_Test3 小时前
js下载excel示例demo
前端·javascript·excel
Yaml43 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
PleaSure乐事3 小时前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶3 小时前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json
getaxiosluo3 小时前
react jsx基本语法,脚手架,父子传参,refs等详解
前端·vue.js·react.js·前端框架·hook·jsx