@chinese-ppmt
2018-04-16T05:21:06.000000Z
字数 1389
阅读 1321
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.