美文网首页
Category的一个冷门小问题

Category的一个冷门小问题

作者: Ashscar | 来源:发表于2017-03-20 16:58 被阅读0次

问题的发现:今日笔者在复习Category的相关知识时,突然发现了一个有趣的小问题,即当一个类的两个(或者更多)分类有同名的方法时,当该方法被调用时,究竟会调用哪一个分类里的方法呢?


如下图所示:

两个分类都有eat方法,然后创建Person对象,并调用该方法,再运行一下,打印结果会是怎样的呢?

好吧,不卖关子了,打印的结果如下:

说明调用了MS分类里的eat方法。

那为什么会调用MS分类的eat方法而不调动MT分类里的方法呢?

难道是两个类的摆放顺序不同导致的?还是随机调用这些分类里的同名方法?

可是我在尝试改变分类的摆放顺序和多次运行后发现,结果还是没变,那到底是怎么回事呢?

在查阅了相关资料后我才弄明白这个问题,原来这与类在编译时的顺序有关。

如下图所示:

在Compile Sources这一栏里,我们可以看到程序编译时要编译的文件,可以看到MS分类是排在MT分类的后面,因此它的eat方法会覆盖MT分类的eat方法,因此调用的eat方法是MS分类的,这下真相重要大白了!不信的话,我们来验证一下。

在交换了MT和MS在Compile Sources这一栏的位置后,我们再运行程序,最后的打印结果如下:

此时调用的是MT分类里的eat方法!

虽然这个问题很小,或者说是一个冷门的知识点,但是在我求根溯源的过程中我还是收获了不一样的快乐和成就感~

相关文章

  • Category的一个冷门小问题

    问题的发现:今日笔者在复习Category的相关知识时,突然发现了一个有趣的小问题,即当一个类的两个(或者更多)分...

  • 05-OC中Category的底层原理

    Category 本质 category的实现原理?,category的底层数据结构? 我们创建一个Person类...

  • iOS-分类 Category

    Category(objc_category) Category是表示一个指向分类的结构体的指针,其定义如下: 分...

  • Category

    Category Category 也叫做分类,可以在不创建子类的情况下为一个类扩展功能。 Category 的作...

  • iOS 面试之Category与Extension(二):常见面

    Q:Category的实现原理,以及Category为什么只能加方法不能加属性? 实际上Category 是一个 ...

  • 五.Category

    Category的使用场合是什么 ?一个类需要拆分为不同模块的时候使用 Category的实现原理Category...

  • Category的加载机制

    序 一直在使用Category,但是对Category的机制不太了解,这里对Category的机制进行一个总结。 ...

  • (一)OC语法03(Category)

    Category的底层结构 在编译完成程序运行之前会先生成一个叫category_t的结构体 Category的加...

  • category

    Category的基本原理? 在编译期会把Category中的方法、属性、协议 打包成一个category_t的结...

  • 12.7 关于Category

    Category如何实现的? category的初始化 声明了一个类,添加了category,里边写了四个方法,分...

网友评论

      本文标题:Category的一个冷门小问题

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