美文网首页
关于Category的学习笔记

关于Category的学习笔记

作者: GY1994 | 来源:发表于2019-03-30 23:34 被阅读0次

Category的加载处理过程

1.通过runtime动态将分类的方法合并到类对象元类对象中.
2.把所有Category方法属性协议数据,合并到一个大数组中。
3.后面参与编译的Category数据,会在数组的前面
4.将合并后的分类数据(方法、属性、协议),插入到类原来数据的前面

例子:

首先我们定义GYPersonGYPerson+Test1GYPerson+Test2
同时添加-(void)run;方法。

1.png
会调用哪个run方法?
这个取决于编译顺序。如上述加载过程4,最后参与编译的方法,会在大数组第一个,所以它一定不会触发GYPersonGYPerson+Test1GYPerson+Test2会触发谁,通过查看编译文件顺序可以得知,如图2
2.jpg
调换顺序,可触发不同分类中的方法。注意:就算把GYPerson移动到最后,也是无法触发GYPerson中的方法

Category与Class Extend的区别

扩展的内容在编译的时候就合并到类信息中,分类是通过Runtime再合并。

Category的Load方法

1.+load方法会在runtime加载分类时调用。
2.调用子类+load之前会先调用父类+load
3.每个分类+load,在程序运行过程中只调用一次
注意:+load比较特殊,一定是先调用类中load。在调用分类中的load。并且不会被分类替代。通过函数地址直接调用,所以无编译顺序说法

Category的initialize方法

1.在第一次接收到消息时调用。([GYPerson alloc]
之后alloc,都不会触发
2.先调用父类,在调用子类

注意:+initialize+load的很大区别是,+initialize是通过objc_msgSend进行调用的,所以有以下特点:
1.如果子类没有实现+initialize,会调用父类+initialize(所以父类的+initialize可能会被调用多次
如果分类实现了+initialize,就覆盖 类本身的+initialize调用

相关文章

  • 关于Category的学习笔记

    Category的加载处理过程 1.通过runtime动态将分类的方法合并到类对象、元类对象中.2.把所有Cate...

  • category学习笔记

    1.category 是什么? 首先,新建一个NcFood类,并添加两个分类 用Clang编译成c++文件 忽略不...

  • iOS-底层-关联对象

    前两篇文章我们学习了关于Category的知识Category分类和load和initialize,现在再看一个问...

  • 《科学中的范畴论》学习笔记

    本系列是《Category Theory for the Sciences》一书的学习笔记。此书亚马逊有售:《Ca...

  • kafka面试题

    本文及其他文章仅为学习笔记,本文转自http://www.kafka.cc/category/interview2...

  • 手机解锁抛光文字

    笔记效果图 创建UIView的Category 使用

  • Category理解笔记

    先自我想想下面关于 Category 思考题: Category能否添加成员变量?如果可以,如何给Category...

  • 关于KVO、KVC思考

    通过最近几天学习。KVC、KVO、Category中打开思路的关键点,是关于isa、superclass。 如果想...

  • iOS的Category底层解析

    一 ,category简介 本文是自我学习iOSruntime的过程中学习的Category的一个自我学习和总结的...

  • Category笔记

    为什么Category无法添加实例变量? Category是无法添加实例变量的,当一个类被编译时,实例变量的布局也...

网友评论

      本文标题:关于Category的学习笔记

      本文链接:https://www.haomeiwen.com/subject/illebqtx.html