6 OC中 isa 和 superclass 的总结
目录
一 关于isa 和 superclass 的总结
二 为什么基类的metaclass 的superclass 指向的是基类的类
三 isa 的细节问题
总结如下:
- instance 的isa 指向是class
- class 的isa 指向是metaclass
- metaclass 的isa指向是基类的imetaclass
- class 的superclass 指向的是父类的class
- class如果没有父类,superclass 指向的是nil
- metaclass 的superclass 指向的是父类的metaclass
- 基类的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 的总结相关推荐
- 6 OC 中的isa 指针
目录 一 isa 指针 二 类对象中的superclass 一 isa 指针 isa 指针 ,OC 中的对象都是有的 如下图所示,实例对象isa 指针指向 类对象,类对象的isa 指针指向 元类对象 ...
- 7 OC 中class 类的结构
目录 一 OC 中class 的结构 https://opensource.apple.com/tarballs/objc4/ 在最新的objc源码中 化繁就简来看的话 是以下结构 struct ob ...
- 5 OC 中的三种对象
目录 OC 中对象的分类 一 instance 对象 二 类对象 三 元类对象 总结: OC 中对象的分类 instance 对象 类对象 元类对象 一 instance 对象 内存中包含哪些信 ...
- iOS底层探索二(OC 中 alloc 方法 初探)
前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...
- 浅谈OC中Block的本质
Block简介 block是将函数及其执行上下文封装起来的一个对象 在block实现的内部,有很多变量,因为block也是一个对象 其中包含了诸如isa指针,imp指针等对象变量,还有储存其截获变量的 ...
- 4 OC 中的内存分配以及内存对齐
目录 一 OC 中的内存分配 一 OC 中的内存分配 student 结构体明明是20?为什么是24个字节,因为结构体会按照本身成员变量最大的内存进行对齐,最大成员变量是8个字节,因此就是8的 ...
- OC中description、 SEL、类本质、self和super用法
一:description方法 description有对象方法和类方法两种,(是NSObject类的方法) 1,-description(对象方法) 使用NSLog和@%输出某个对象时,会调用对象的 ...
- c语言访问oc变量,OC中的方法调用流程
OC是一门动态语言,其方法调用方式与C++还是有很大区别的. 具体的方法调用过程,可以参考下面一片枫叶的博客,写的还是很详细的. 对于OC的方法调用,有两个点是重点: 1.对于OC的一切方法调用,最终 ...
- OC中Runtime浅析
近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程 ...
最新文章
- java查询结果自定义显示_JPA自定义对象接收查询结果集操作
- socket recv 服务端阻塞 python_网络编程(基于socket编程)
- 通过PHP前端后台交互/通过ajax前端后台交互/php基础传输数据应用/简单的留言版/简单的注册账户/简单的登录页/...
- ES6中新增字符串方法,字符串模板
- JAVA spring配置文件总结
- 关于神经网络训练的一些建议笔记
- cesium(鼠标事件)
- 5月份美网络游戏用户达8700万 同比增长22%
- php服务器去广告,php – 简单的广告服务器
- [20180614]删除bootstrap$记录无法启动2.txt
- python中文件的读写方式_Python文件处理之文件写入方式与写缓存(三)
- (2)海思烧写工具Hitool工具使用
- matlab求一元函数极值点和拐点,matlab求函数的极值点和拐点函数y=x^2*sin(x^2-爱问知识人...
- 禁止横竖屏切换、强制横竖屏
- C语言中文网学习进度
- 非接触式CPU卡的外部认证和内部认证过程
- IOS 公司开发者账号申请详细教程-13810208661
- java调用海康威视人脸识别抓拍
- (二)向前 向后 中心差商
- vector 通俗易懂描述