OC中类的Self 和 Super调用方法的本质
2017-12-25 23:41
232 查看
问题引出:神经病院objc runtime入院考试
享受一下来自底层的高端操作。
先上图为敬
Vc类:
Son类
打印结果:
首先创建一个 测试,我的思路是:创建一个son,一个father,son的父类的father,然后在son类中 提供对象方法,同时在h文件暴露该方法,在Vc中进行调用测试,发现结果在调用[super class]的时候确实是打印的SonViewCOntroller。
总结1、2:1、假如self和super调用的方法是在父类的父类中,打印[** class],其实就是打印的theReceiver,因为无论是[self class],还是[super class]他们的 theReceiver都是一样的。不要问为什么会这样,你可以想想在写单例的时候,为什么还会用到self==[super init]的这样的判断,其实本来可以不写,但是防止内存泄漏的问题,把这个写上,可以预防程序崩溃。
2、引出新的问题:在一个类中可以调用 [super init],既然能找到super的这个类,肯定是有isa指针指向super所在的 栈区,堆区就会有相应的空间。所以类是对象吗?应该怎么理解呢?
享受一下来自底层的高端操作。
先上图为敬
Vc类:
Son类
打印结果:
首先创建一个 测试,我的思路是:创建一个son,一个father,son的父类的father,然后在son类中 提供对象方法,同时在h文件暴露该方法,在Vc中进行调用测试,发现结果在调用[super class]的时候确实是打印的SonViewCOntroller。
原因(底层方法,现在Apple不让查看了):1、在调用[self class]的方法的时候,其实是调用的 id objc_msgSend(id theReceiver, SEL theSelector, ...) 第一个参数是,消息接受者,按照咱们的例子,应该是sonVc, sel则为方法,该方法如果在sonVc类中没有找到,就会不停地往上一级查找,知道找到NSObject中的sel。 2、在调用[super class]的方法的时候,其实是调用的 id objc_msgSendSuper(struct objc_super *super, SEL op, ...) 其中super是一个结构体
struct objc_super { id receiver; Class superClass; };
在方法中的第二个参数所要找的sel,会从这个结构体的Class 来定位,找呀找,还是在NSObject中找到sel,于是调用 objc_msgSend(objc_super->receiver, @selector(class)) 。
总结1、2:1、假如self和super调用的方法是在父类的父类中,打印[** class],其实就是打印的theReceiver,因为无论是[self class],还是[super class]他们的 theReceiver都是一样的。不要问为什么会这样,你可以想想在写单例的时候,为什么还会用到self==[super init]的这样的判断,其实本来可以不写,但是防止内存泄漏的问题,把这个写上,可以预防程序崩溃。
2、引出新的问题:在一个类中可以调用 [super init],既然能找到super的这个类,肯定是有isa指针指向super所在的 栈区,堆区就会有相应的空间。所以类是对象吗?应该怎么理解呢?
相关文章推荐
- OC基础day4-继承,self,super,多态,类对象,SEL类型,description,私有方法与私有变量,三种访问限制
- OC多文件开发简单例子实现(重点:self在对象方法中调用其他对象方法的3种方法)
- OC语言的第四天 static、self、super、继承、NSObject类、私有属性和私有方法、多态
- 黑马程序猿_OC之类方法与对象方法、self与super
- OC第三天-继承,初始化方法,便利构造器 ,self,super,方法重写
- OC视频笔记2.3(OC继承的使用)2.4(self与super)2.5(方法的重写)
- iOS 类继承时self和super调用方法的问题
- OC-对象方法/类方法/self/super(1)
- OC学习日记-继承,多态,私有属性、变量和方法,self,super,属性修饰符,description
- OC中description、 SEL、类本质、self和super用法
- oc语言学习之基础知识点介绍(四):方法的重写、多态以及self、super的介绍
- 关于OC中self是调用属性的存取方法以及它可能出现的内存泄露情况
- 子类中方法与父类中形成重写关系,可以在构造方法中用super来调用父类中的该方法
- 黑马程序员——OC学习之类的本质和常用的继承自NSObject的方法
- UIWebView中Html中用JS调用OC方法及OC执行JS代码
- java里的clone方法,super.clone()到底调用的是谁??
- super.getClass()方法调用
- 【Objective-C】OC中对象创建,self,super的详解
- OC 类方法的调用
- 12-OC中调用Array集合里面每个元素的方法