美文网首页
类对象调用实例方法的原理

类对象调用实例方法的原理

作者: 天津的树懒 | 来源:发表于2020-02-20 23:04 被阅读0次

我们都知道一个类对象只能调用本类或者它的父类的类方法,其实一个类对象也能调用它的父类里面写的实例方法,下面为您揭开这里面的原理。

首先请看下面的OC对象中的三种类型的对象(实例对象、类对象、元类对象)之间的关系。下面就将围绕他们之间的关系讲述这里面的原理。如果您还对这张图有疑问的话,请移步本人撰写的OC对象调用方法原理

OC对象之间的关系

首先在文件中创建一个自定义类:

@interface Person : NSObject

+ (void)test;

@end

@implementation Person

@end

这个Person类的父类是NSObject类。

然后创建一个NSObject类的分类,并且声明一个test类方法,但是不实现它。在这个分类中撰写一个相同方法名的test的实例方法。

NSObject+Test.h文件

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSObject (Test)

+ (void)test;

@end

NS_ASSUME_NONNULL_END

NSObject+Test.m文件

#import "NSObject+Test.h"

@implementation NSObject (Test)

- (void)test
{
    NSLog(@"-[NSObject test] - %p", self);
}

@end

在main.m文件中用Person类调用test方法:

[Person test];

最后在控制台的打印结果为:

-[NSObject test] - 0x1000011e0

说明子类的类对象成功调用了父类的实例方法。

它的原理为:

当Person类中没有实现test类方法,并且在NSObject类中也没有实现test类方法,但是在NSObject类中实现了test实例方法的时候,运行如下的代码,具体的调用流程为:系统根据Person类的class对象中的isa指针找到Person类的meta-class对象,在该meta-class对象中没有找到test类方法,然后系统再根据该meta-class对象中的superclass指针找到Person类的父类(NSObject类)的meta-class对象,系统在基类的meta-class对象中没有找到test类方法,然后系统再根据基类的meta-class对象中的superclass指针找到NSObject类的class对象,然后在NSObject类的class对象中找到了test实例方法,最后再进行调用,整个调用过程结束。

在main.m文件中的这句代码

[Person test];

其实可以写成

objc_msgSend([Person class], @selector(test));

的形式,从objc_msgSend可以看出,OC对象在调用方法的时候其实是不知道调用的是实例方法还是类方法的,只知道是给谁发消息,根据消息名一步一步地寻找,直到找到了为止。

Github Demo

”三人行,必有我师焉“, 欢迎各位批评指正。
如果您还觉得我写的不错的话请您点赞加关注,您的肯定是我前进的最大动力!
我是爱学习也爱您的树懒O(∩_∩)O

相关文章

  • 再论静态方法和类方法

    实例对象可以调用实例方法、类方法、静态方法 类对象只能调用类方法、静态方法

  • Swift 中的方法声明

    实例方法 类方法 静态方法 实例方法由实例对象进行调用;类方法和静态方法由类对象进行调用

  • 类中的方法

    1.实例方法的调用方式 实例对象.实例方法() 类对象.实例方法(实例对象) 例如: class Student ...

  • 底层原理:Category

    实例对象的isa指向类对象,当调用对象方法时,通过实例对象的isa找到类对象,最后找到对象方法的实现进行调用,分类...

  • 对象、类对象、元类对象&消息传递机制

    类对象:存储实例方法列表等信息。 元类对象:存储类方法列表等信息。 调用的类方法没有对应的实现,则会调用同名的实例...

  • isKindOfClass 和 isMemberOfClass

    这两个方法都有实例方法和类方法实例方法内部:调用者的类对象 == 传进去的 cls类方法内部:调用者的元类的对象 ...

  • 类对象调用实例方法的原理

    我们都知道一个类对象只能调用本类或者它的父类的类方法,其实一个类对象也能调用它的父类里面写的实例方法,下面为您揭开...

  • OC重学第二天

    一. 类方法 OC 中方法分为两种.对象方法/实例方法如果想要调用对象方法必须要创建对象,通过对象来调用类方法.类...

  • 类方法和实例方法理解

    1,类方法可以调用类方法。 2,类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。 3,类方法不...

  • IOS精选面试题(三)

    OC调用一个方法底层做了哪些事 一:如果是调用实例方法,通过实例对象的isa指针找到类对象,在类对象的方法缓存(c...

网友评论

      本文标题:类对象调用实例方法的原理

      本文链接:https://www.haomeiwen.com/subject/chafqhtx.html