[关闭]
@chinese-ppmt 2018-04-16T05:21:06.000000Z 字数 1389 阅读 1249

runtime学习001 [super class]

runtime


super 和 self

关于superself,请先阅读以下blog,对你理解下文很有帮助。

  1. iOS 程序员 6 级考试(答案和解释)
  2. Objective-C self与super的区别

objc_msgSend 和 objc_msgSendSuper

关于[self class][super class]的结果的求证:如下

CXYExpress.h

  1. @interface PPPerson : NSObject
  2. @property(nonatomic,copy) NSString *name;
  3. @end
  4. @interface PPStudent : PPPerson
  5. @property(nonatomic,copy) NSNumber *age;
  6. @property(nonatomic,assign) BOOL isMan;
  7. @end

CXYExpress.m

  1. @implementation PPPerson
  2. @end
  3. @implementation PPStudent
  4. - (id)init
  5. {
  6. self = [super init];
  7. if (self)
  8. {
  9. NSLog(@"PPStudent self %@", NSStringFromClass([self class]));
  10. NSLog(@"PPStudent super %@", NSStringFromClass([super class]));
  11. }
  12. return self;
  13. }
  14. @end

打开终端,cdCXYExpress.m所在的文件,执行以下命令:

  1. clang -rewrite-objc CXYExpress.m

CXYExpress.m转成CXYExpress.cpp文件

CXYExpress.cpp
CXYExpress.cpp中PPStudent的init方法

现在只来解读[super class]这部分代码(一步一步地):

考虑到代码太长,贴代码的话,blog效果不好,所以我都截图说明。

第一步:

最原始的[super class]编译后的.cpp代码

原始.png

第二步

剥离出NSLog中的NSStringFromClass

剥离NSStringFromClass.png

第三步:

剥离出NSStringFromClass中的Class(如下源码中:)

  1. FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);

剥离出Class.png

第四步:

整理简化Classobjc_msgSendSuper的参数。

剥离objc_msgSendSuper参数.png

关于objc_msgSendSuper请参考官方API如下:

objc_msgSendSuper官方API.png

关于objc_super可以参考Runtime全方位装逼指南的第6条。

第五步:

objc_msgSendSuper函数指针强制转换
【警告】关于 函数指针强制转换我自己理解不多,只能是依葫芦(API文档格式)画瓢,望谅解。

函数指针类型强制转换.png

对上图,我做以下我的理解说明:
tag1: 不明白。
tag2: 如上上图(官方API)的objc_msgSendSuper返回值是void,但是此处需要的是Class类型。所以需要把objc_msgSendSuper这个函数,强制指针类型转换,即函数指针强制转换

官方开源的NSObject.mm

参考链接:

1. 将指针强制类型转换为函数指针
2. Runtime全方位装逼指南
3. Objective-C Runtime 1小时入门教程
4. 从runtime.h 读取的Class
5. 深入理解Objective-C的Runtime机制
6. runtime从入门到精通(二)—— 官方文档翻译
7.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注