【iOS重学】一篇文章讲清楚super
写在前面
经常在网上看到[super xxx]
这种输出什么内容等类似的面试题,本文就主要来详细剖析一下这种[super xxx]
中super
调用的底层原理。
场景
博主这里用一个常看到的面试题来引出本文的主题:
// Person类 |
打印结果如下:
2023-01-30 16:10:51.753257+0800 SuperDemo[27224:16387952] 1 - Student |
结果分析:
我们这里以[super class]
为例来看其底层结构:
用命令 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-10.0.0 Student.m
将Student.m文件转化为c++文件,[super class]
底层如下:
((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("Student"))}, sel_registerName("class")); |
简化之后为:
objc_msgSendSuper(__rw_objc_super{ |
为了让大家更方便理解,最终结构如下:
struct __rw_objc_super arg = { |
在源码中我们搜索一下objc_super
结构体:
从上面的分析,我们可以看到:[super class]
中消息接收者还是self
也就是说还是Student
,同理[super superclas]
打印结果还是Person
。
写在最后
关于super
调用本质的原理我们在这片文章就分析清楚了,如有错误请多多指教。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ayanokouji!
评论