当前位置: 首页 > news >正文

【iOS】—— 继承者链

【iOS】—— 继承者链

  • 1.什么是元类
  • 2.根元类NSObject
  • 3. isa走位和继承关系图
    • 3.1 isa走位
    • 3.2 superClass走位
  • 4. class方法
    • 4.1实例对象调用class方法
    • 4.2类对象调用class方法

1.什么是元类

对象的isa指针指向类,类也是一种对象被称为类对象,其isa的指向是元类。
元类是系统给的,定义和编译是由编译器完成的。
每个类都有独一无二的元类,用来存储类方法。
可以通过下面的图来解释:
在这里插入图片描述
对象 --> 类 --> 元类 --> NSobject,NSObject指向自身。

2.根元类NSObject

从上图可以看出,最后的根元类是NSObject,这个NSObject与我们日开开发中所知道的NSObject是同一个吗?
我们来通过代码验证一下:

Class class1 = [LGstudent class];
Class class2 = [LGstudent alloc].class;
Class class3 = object_getClass([LGstudent alloc]);
NSLog(@"\n%p-\n%p-\n%p-\n", class1, class2, class3);			

从打印结果如下:
在这里插入图片描述可以看出打印出来的地址是相同的,说明NSObject只有一份,即NSObject(根元类)在内存中永远只存在一份,由于类的信息在内存中永远只存在一份,所以类对象只有一份。

3. isa走位和继承关系图

根据上面的探索以及各种验证,对象、类、元类、根元类的关系如下图所示:
在这里插入图片描述

3.1 isa走位

  • 实例对象(Instance of Subclass)的isa指向类(class);
  • 类对象(Class)的isa指向元类(Meta Class);‘
  • 元类(Meta class)的isa指向根元类(Root meta Class);
  • 根元类的isa指向自己本身,形成闭环,这里的根元类就是NSObject;

3.2 superClass走位

类之间的继承关系:

  • 类(class)的继承自父类(superClass);
  • 父类(superClass)继承自根类(RootClass),这里的根类是NSObject;
  • 根类继承自nil;

元类之间的继承关系:

  • 子类的元类(meta subclass)继承自父类的元类(meta superClass);
  • 父类的元类(meta superClass)继承自根元类(Root meta Class);
  • 根元类(Root meta Class)继承自根类(Root Class),这里的根类是NSObject;

【注意】实例对象之间没有继承关系,类之间有继承关系

4. class方法

class 方法是一种用于获取对象所属类的实例方法。它是NSObject类定义的方法,因此几乎所有的 Objective-C 对象都可以使用class方法。
使用 class 方法,我们可以获得以下信息:

  1. 类对象:class 方法返回一个指向对象所属类的指针,也称为类对象(class object)。类对象是一个表示类的数据结构,它包含了类的方法、属性以及其他类相关的信息。
  2. 运行时类型识别(Runtime Type Identification,RTTI):通过 class 方法,我们可以在运行时确定对象的实际类型。这对于处理多态情况下的对象非常有用,可以根据对象的实际类型来执行特定的操作。
  3. 继承关系:class 方法在继承关系中起着重要的作用。不论我们使用基类指针还是子类指针引用对象,在通过 class 方法获取对象的类时,都会返回对象所属的实际子类的类对象。这使得我们可以根据对象的类型来执行相应的操作,而不用关心具体的子类。
  4. 元类(Metaclass):类对象本身也是一个对象,它属于元类的实例。元类用于表示类对象的类信息,相当于类对象的类对象。通过 class 方法可以获取类对象的元类,从而可以进一步探索和操作类的信息。

4.1实例对象调用class方法

实例调用class方法返回对象所属的类对象,用于获取对象的类信息
通过下面的代码来展示一下:

LGstudent* lgstudent = [[LGstudent alloc] init];
Class objclass = [lgstudent class];
NSLog(@"Object class: %@", objclass);

运行结果:
在这里插入图片描述
使用实例调用 [lgstudent class] 获取对象的类。实际对象类型是LGstudent,因此返回的是 LGstudent类对象。

4.2类对象调用class方法

类调用 class 方法返回类的元类(metaclass),用于获取类的信息。
通过下面的代码来展示一下:

Class myclass = [student class];
Class objclass = object_getClass(myclass);
NSLog(@"\nObject class: %@", objclass);

运行结果:
在这里插入图片描述
使用类调用[student class]获student的类对象,并使用object_getClass函数获取类对象的元类。
类调用class方法返回的是类的元类,而不是类本身的类对象。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 访问者模式(Visitor Pattern)
  • 监控房价和挂牌数量的工具-以成都房价为例
  • 群晖 搭建alist 记录
  • AWS无服务器 应用程序开发—第十八章 AWS EventBridge
  • AI绘画Stable Diffusion 零基础入门 —AI 绘画原理与工具介绍,万字解析AI绘画的使用教程
  • <Rust>egui部件学习:如何在窗口及部件显示中文字符?
  • 谷歌C语言编码规范详解
  • AI安全入门-人工智能数据与模型安全
  • 免费长效IP在业务场景中的深度应用解析
  • 移掉 K 位数字
  • RK3568 安卓12 EC20模块NOCONN没有ip的问题(已解决)
  • elasticsearch过滤器filter:原理及使用
  • [Linux]基本指令(二)
  • 【C语言】深入解析希尔排序
  • Spring Boot项目的控制器貌似只能get不能post问题
  • Fastjson的基本使用方法大全
  • Java多线程(4):使用线程池执行定时任务
  • Zsh 开发指南(第十四篇 文件读写)
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 关于Java中分层中遇到的一些问题
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 区块链技术特点之去中心化特性
  • 收藏好这篇,别再只说“数据劫持”了
  • 运行时添加log4j2的appender
  • 字符串匹配基础上
  • 06-01 点餐小程序前台界面搭建
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 从如何停掉 Promise 链说起
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 我们雇佣了一只大猴子...
  • #NOIP 2014# day.1 T2 联合权值
  • (13)Hive调优——动态分区导致的小文件问题
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (k8s)kubernetes集群基于Containerd部署
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (三)c52学习之旅-点亮LED灯
  • (四)软件性能测试
  • (一)为什么要选择C++
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .Net FrameWork总结
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 使窗口永不获得焦点
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • :中兴通讯为何成功
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400