目录

一 关于isa 和 superclass 的总结

二  为什么基类的metaclass 的superclass 指向的是基类的类

三  isa 的细节问题


总结如下:

  1. instance 的isa 指向是class
  2. class 的isa 指向是metaclass
  3. metaclass 的isa指向是基类的imetaclass
  4. class 的superclass 指向的是父类的class
  5. class如果没有父类,superclass 指向的是nil
  6. metaclass 的superclass 指向的是父类的metaclass
  7. 基类的metaclass 的superclass 指向的是基类的类

1 所以实例对象方法的调用轨迹是

isa 找到class,通过superclass 一直往上寻找,直到找到对应的方法,如果找不到,就结束,抛出异常

2 类对象方法调用的轨迹是

isa 找到metaclass,方法不存在,通过superclass 一直寻找,如果找不到,就结束,抛异常

二  为什么基类的metaclass 的superclass 指向的是基类的类

Person 类的类方法和 NSObject 类的类方法都没有实现,但是Person 类 和 NSObject 调用类方法却没有崩溃产生?

从上图可以看出来

正式因为metaclass的superclass 指向的是基类的类,因为基类中有同名的test 方法,所以没有崩溃产生。

因为代码的本质是

[Person test];

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

只是告诉给这个类发送消息,调用test方法,并没有告知是+ 方法 或者 - 方法

oc 调用方法的本质就是通过方法名字去寻找,不会区分类方法和实例对象方法


#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface NSObject (Test)+ (void)test;@endNS_ASSUME_NONNULL_END#import "NSObject+Test.h"@implementation NSObject (Test)//  不实现NSObject 类的 类方法 test//
//+ (void)test{
//
//    NSLog(@"+[Person test] -- %p",self);
//}// 但是实现NSObject 的对象方法
- (void)test{NSLog(@"-[Person test] -- %p",self);
}@end
#import <Foundation/Foundation.h>
#import "NSObject+Test.h"@interface Person : NSObject+ (void)test;@end@implementation Person//  不实现person 类的 类方法 test//+ (void)test{
//
//    NSLog(@"+[Person test] -- %p",self);
//}@endint main(int argc, const char * argv[]) {@autoreleasepool {// insert code here...NSLog(@"Hello, World!");[Person test];[NSObject test];}return 0;
}

三  isa 的细节问题

实例对象的isa 指向 class,那么isa 中存在的地址值是否就是class 的地址值呢?

其实在64位以前,确确实实isa的中存在的地址值就是class的地址值,但是在64位以后,要进行一次与运算,才能获取class 的地址值

但是superclass 指针是不存在这个问题的

6 OC中 isa 和 superclass 的总结相关推荐

  1. 6 OC 中的isa 指针

    目录 一 isa 指针 二 类对象中的superclass 一 isa 指针 isa 指针 ,OC 中的对象都是有的 如下图所示,实例对象isa 指针指向 类对象,类对象的isa 指针指向 元类对象 ...

  2. 7 OC 中class 类的结构

    目录 一 OC 中class 的结构 https://opensource.apple.com/tarballs/objc4/ 在最新的objc源码中 化繁就简来看的话 是以下结构 struct ob ...

  3. 5 OC 中的三种对象

    目录 OC 中对象的分类 一  instance 对象 二 类对象 三  元类对象 总结: OC 中对象的分类 instance 对象 类对象 元类对象 一  instance 对象 内存中包含哪些信 ...

  4. iOS底层探索二(OC 中 alloc 方法 初探)

    前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...

  5. 浅谈OC中Block的本质

    Block简介 block是将函数及其执行上下文封装起来的一个对象 在block实现的内部,有很多变量,因为block也是一个对象 其中包含了诸如isa指针,imp指针等对象变量,还有储存其截获变量的 ...

  6. 4 OC 中的内存分配以及内存对齐

    目录 一  OC  中的内存分配 一  OC  中的内存分配 student 结构体明明是20?为什么是24个字节,因为结构体会按照本身成员变量最大的内存进行对齐,最大成员变量是8个字节,因此就是8的 ...

  7. OC中description、 SEL、类本质、self和super用法

    一:description方法 description有对象方法和类方法两种,(是NSObject类的方法) 1,-description(对象方法) 使用NSLog和@%输出某个对象时,会调用对象的 ...

  8. c语言访问oc变量,OC中的方法调用流程

    OC是一门动态语言,其方法调用方式与C++还是有很大区别的. 具体的方法调用过程,可以参考下面一片枫叶的博客,写的还是很详细的. 对于OC的方法调用,有两个点是重点: 1.对于OC的一切方法调用,最终 ...

  9. OC中Runtime浅析

    近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程 ...

最新文章

  1. java查询结果自定义显示_JPA自定义对象接收查询结果集操作
  2. socket recv 服务端阻塞 python_网络编程(基于socket编程)
  3. 通过PHP前端后台交互/通过ajax前端后台交互/php基础传输数据应用/简单的留言版/简单的注册账户/简单的登录页/...
  4. ES6中新增字符串方法,字符串模板
  5. JAVA spring配置文件总结
  6. 关于神经网络训练的一些建议笔记
  7. cesium(鼠标事件)
  8. 5月份美网络游戏用户达8700万 同比增长22%
  9. php服务器去广告,php – 简单的广告服务器
  10. [20180614]删除bootstrap$记录无法启动2.txt
  11. python中文件的读写方式_Python文件处理之文件写入方式与写缓存(三)
  12. (2)海思烧写工具Hitool工具使用
  13. matlab求一元函数极值点和拐点,matlab求函数的极值点和拐点函数y=x^2*sin(x^2-爱问知识人...
  14. 禁止横竖屏切换、强制横竖屏
  15. C语言中文网学习进度
  16. 非接触式CPU卡的外部认证和内部认证过程
  17. IOS 公司开发者账号申请详细教程-13810208661
  18. java调用海康威视人脸识别抓拍
  19. (二)向前 向后 中心差商
  20. vector 通俗易懂描述

热门文章

  1. [JSOI2008]魔兽地图
  2. js query复习
  3. Java 时间和日期类型的 Hibernate 映射
  4. 引用类型(一):Object类型
  5. 洛谷P2429 制杖题 [2017年6月计划 数论10]
  6. 执行eclipse,迅速failed to create the java virtual machine。
  7. Singleton 单例模板
  8. 史上最浅显易懂的Git教程!
  9. E8.Net 2005工作流平台版本发布
  10. win10安装spacemacs