ios 使用super方法

155 阅读1分钟

1、如何把ios里面的.m文件转换成c++的.cpp文件?

  1. 打开终端 cd 自己的工程文件
  2. 用终端命令:clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk xxx.m

示例样例 image.png

Demo展示:

假如我在子类里面调用super class,猜猜这是会打印出什么? image.png 打印的结果如下,为什么super class会打印的还是子类呢? image.png 想深入看下去,我们就需要知道消息发送是怎么走的。先转成.cpp文件看一下具体的内在是怎么实现的吧。通过上述转我们得到LGTeacher.cpp文件,打开文件,找到对应的方法那里。

image.png 我们知道OC所有的消息发达都会转化成objc_msgSend这个方法。 而这里【self class】会转化成(void *)objc_msgSend)((id)self, sel_registerName("class")),接受者是self,方法名是class. [super class]转化成(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("LGTeacher"))}, sel_registerName("class")));,他的接受者还是自己本身,只是他是从他的父类里查找class方法,看到没有。

总结:[self class]调用的是objc_msgSend,接收者是自身,从类里面找对应的方法class.而[super class]调用的是class_getSuperclass,接受者也是self,但是他是从父类中去找对应的方法。所以最后两者打印的都是self。