美文网首页
iOS-消息机制obj_msgsend与Super

iOS-消息机制obj_msgsend与Super

作者: Johnny_Wu | 来源:发表于2021-07-03 11:59 被阅读0次

一、前提

查看OC编译后的代码:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m
可以生成main.m编译后的文件,会生成main.cpp文件,就是oc转换成c的文件。我们可以通过这个cpp文件分析一些OC的特性。

二、消息机制obj_msgsend

1、通过几张图分析:

[图片上传中...(截屏2021-07-03 上午11.27.49.png-f865cf-1625282875296-0)] 截屏2021-07-03 上午11.28.17.png 截屏2021-07-03 上午11.28.54.png

2、看个问题:

截屏2021-07-03 上午11.42.42.png

要分析这个问题,我们先看看这两个函数的伪代码:


截屏2021-07-03 上午11.43.35.png

不管是isMemberOfClass还是isKindOfClass,内部对调用者都会执行object_getClass,那说明调用者直接变成上一级,再进行比较,级数关系为:对象<类<元类。
根据这个,可以很容易推理出MJPerson的两个判断和[NSObject isMemberOfClass]都false。因为object_getClass(MJPerson)-元类和[MJPerson class]-类,不在一个级别上。

最后看看[NSObject isKindOfClass:[NSObject class]]。感觉这两个也不在一个级别,为什么就是真呢?


截屏2021-07-03 上午11.52.17.png

结合上图和isKindOfClass的实现,任何继承于NSObject的对象或类,如obj,如果使用[obj isKindOfClass:[NSObject class]]都是真,因为isKindOfClass会不断找父类。如上图,不断找父类,不管类或元类,都会最终找到NSObject。

三、Super

1、先看问题:

截屏2021-07-03 上午11.30.10.png
上图的MJStudent的父类为MJPerson,测试代码是在MJStudent中。上面两个还好理解。我们主要分析下[super class]和[super superclass]。
我们知道class和superclass方法都是在NSObject里面的,大概实现如下:
截屏2021-07-03 上午11.34.34.png
看到实现,我们只要分析调用者self是谁,就能得到结论。那么super的调用者self是谁呢?
其实super的调用者还是本类,本案例是在MJStudent中进行测试,所以super的调用者就是MJStudent。super只是让MJStudent的消息查找从父类开始,直接跳过本类的消息查找。所以答案很明显了。

相关文章

  • iOS-消息机制obj_msgsend与Super

    一、前提 查看OC编译后的代码:xcrun -sdk iphoneos clang -arch arm64 -re...

  • Runtime 机制

    1.Runtime 消息机制 从xcode6之后苹果不建议直接使用obj_msgSend(),需要自已去xcode...

  • Runtime 03 - objc_msgSend、super

    Runtime 03 - objc_msgSend、super Objective-C 的消息机制 Objecti...

  • 深入了解runtime

    iOS经典讲解之[self class]和[super class]的区别 iOS的消息机制和消息转发 Objec...

  • iOS-消息转发机制

    先从一个经典的报错开始。 是的,就是方法实现找不到,unrecognized selector sent to i...

  • 单元测试UnitTest

    来源iOS-使用Xcode自带单元测试UnitTest - 简书 - (void)setUp {[super se...

  • iOS- UI事件传递& 响应

    UI视图相关重要知识点 传送带: iOS- UITableView重用机制 iOS- UITableView数据源...

  • 运行时

    运行时 调用 消息转发 通过 obj_msgSend 调用,在找不到imp的时候,就会进入消息转发流程 调用 + ...

  • OC消息机制和super关键字

    阅读原文请到我的博客OC消息机制和super关键字 消息发送 在Objective-C里面调用一个方法[objec...

  • iOS-私有API与runtime

    iOS-私有API与runtime iOS-私有API与runtime

网友评论

      本文标题:iOS-消息机制obj_msgsend与Super

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