@chinese-ppmt
2018-04-16T05:21:06.000000Z
字数 1389
阅读 1406
runtime
关于
super和self,请先阅读以下blog,对你理解下文很有帮助。
关于[self class] 和 [super class]的结果的求证:如下
CXYExpress.h
@interface PPPerson : NSObject@property(nonatomic,copy) NSString *name;@end@interface PPStudent : PPPerson@property(nonatomic,copy) NSNumber *age;@property(nonatomic,assign) BOOL isMan;@end
CXYExpress.m
@implementation PPPerson@end@implementation PPStudent- (id)init{self = [super init];if (self){NSLog(@"PPStudent self %@", NSStringFromClass([self class]));NSLog(@"PPStudent super %@", NSStringFromClass([super class]));}return self;}@end
打开终端,cd到CXYExpress.m所在的文件,执行以下命令:
clang -rewrite-objc CXYExpress.m
把CXYExpress.m转成CXYExpress.cpp文件
CXYExpress.cpp

考虑到代码太长,贴代码的话,blog效果不好,所以我都截图说明。
最原始的
[super class]编译后的.cpp代码

剥离出
NSLog中的NSStringFromClass

剥离出
NSStringFromClass中的Class(如下源码中:)
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);

整理简化
Class中objc_msgSendSuper的参数。

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

关于
objc_super可以参考Runtime全方位装逼指南的第6条。
objc_msgSendSuper的函数指针强制转换。
【警告】关于 函数指针强制转换我自己理解不多,只能是依葫芦(API文档格式)画瓢,望谅解。

对上图,我做以下我的理解说明:
tag1: 不明白。
tag2: 如上上图(官方API)的objc_msgSendSuper返回值是void,但是此处需要的是Class类型。所以需要把objc_msgSendSuper这个函数,强制指针类型转换,即函数指针强制转换。
1. 将指针强制类型转换为函数指针
2. Runtime全方位装逼指南
3. Objective-C Runtime 1小时入门教程
4. 从runtime.h 读取的Class
5. 深入理解Objective-C的Runtime机制
6. runtime从入门到精通(二)—— 官方文档翻译
7.