iOS ------ 类 父类 元类的总结

一,类的定义

类在OC中其实是指向objc_class的结构体指针,结构体构造我

typedef struct objc_class *Class;  
struct objc_class {  
    Class isa;  
    Class super_class;  
    const char *name;  
    long version;  
    long info;  
    long instance_size;  
    struct objc_ivar_list *ivars;  
    struct objc_method_list **methodLists;  
    struct objc_cache *cache;  
    struct objc_protocol_list *protocols;  
}; 

OC中的对象全部继承objc_object结构体

struct objc_object {
    Class _Nonnull isa __attribute__((deprecated));
};

在OC中,对象的类是isa指针决定的,即isa指针指向对象所属的类。类的isa指针指向类它所属的元类。

二,元类的定义

先了解一下消息转发机制:

OC对象在发生消息时,运行时库会寻找对象isa指针找到随想所属的类。这个类包含了能应用于这个类所有的实例方法以及指向父类的指针,以便找到父类的实例方法。运行时库会坚持这个类和其父类的方法列表,遭到于消息对应的方法。编译器会将消息转化为消息函数objc_msgSend进行调用。

有时我们对象的类方法,会出现对类发生消息的情况:

NSString *testString = [NSString stringWithFormat:@"%d",3];

从此处我们可以类比出:OC的类也是一个对象。一个对象就有它所属的类,同样我们从上面知道每个类也有一个isa指针,也是指向他所属的类。那么类所属的类时什么?就是要将的元类(MetaClass),元类就是类的所属类

meta_class对象 每个类在内存中有且只有一个meta-class对象。在内存中存储的信息主要包括

  • isa指针
  • superclass指针
  • 类的类方法的信息(class method)

三,类 父类 元类的总结

在这里插入图片描述

第一列表示的是初始化对象(obj_object),这个对象里面有一个isa指针指向它所属的类,也就是图中的第二列;obj_class结构体里面存放的isa指针即指向了它的元类,也就是第三列;第三列的所有元类的isa指针都指向了上帝类NSObject的元类(meta)。从图上上帝类NSObject的元类的isa指针最后又指向了NSObject这个类本身,所以构成了一个回路。

元类和类一样它们之间也有继承的关系,它们中都有superclass指针指向它们所属的父类。所有类最终指向类基类NSOobject,所以的元类最终指向了NSObject的元类。基类NSOobjectsuperclass指针指向了nil,而NSObject的元类superclass指针最终却指向了NSObject本身。

四,为什么需要类对象和元类对象?

我们知道。我们创建的类,有很多的属性,协议和方法。方法有分为实例方法和类方法。而这些方法的实现都是统一的,在调的过程中,只是参数的值不同,所以这些方法存一份就够了,没必要每个对象都存一份。所以就有了类对象和元类对象。

假定Person类有一个实例方法叫-(void)instanceFunction,有个类方法+(void)classFunction。我们在调用的时候是这么调用的:

- (void)callFunctions{
    [person instanceFunction];     //使用实例对象来调用实例方法
    [Person classFunction];        //使用类名(其实就是类对象)调用类方法
}

可以看出方法的调用者不同。而这个不同就是类对象和元类对象,isa指针来实现的。类对象中存储了类的属性,协议和实例方法。元类对象中存储类了这个类的类方法。在方法调用时,实例方法通过实例对象的isa找到这个类的对象,然后在类对象中查找这个方法。类对象通过类对象的isa找到这个类的元类对象,在元类对象中查找这个方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/799922.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElementUI el-select 组件动态设置disabled后,高度变更的问题解决办法

问题描述 Vue2 项目在使用 el-select 组件时,动态将disabled变更为了 true,元素的高度发生了变化。 问题原因 通过浏览器开发人员工具面板,发现,组件内的 input 元素被动态设置了height的样式: 在项目中检查后并…

基于STM32设计的超声波测距仪(微信小程序)(186)

基于STM32设计的超声波测距仪(微信小程序)(186) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择1.5 系统框架图…

<数据集>钢板缺陷检测数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:1986张 标注数量(xml文件个数):1986 标注数量(txt文件个数):1986 标注类别数:7 标注类别名称:[crescent gap, silk spot, water spot, weld line, oil spot, punchin…

人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解。在机器学习和深度学习领域,模型的训练目标是找到一组参数,使得模型能够从训练数据中学习到有用的模式&am…

mysql命令练习

创建数据表grade: CREATE TABLE grade( id INT NOT NULL, sex CHAR(1), firstname VARCHAR(20) NOT NULL, lastname VARCHAR(20) NOT NULL, english FLOAT, math FLOAT, chinese FLOAT ); 向数据表grade中插…

基于springboot与vue的旅游推荐系统与门票售卖

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

图像边缘检测中Sobel算子的原理,并附OpenCV和Matlab的示例代码

Sobel算子是一种用于图像边缘检测的离散微分算子。它结合了图像的平滑处理和微分计算,旨在强调图像中强度变化显著的区域,即边缘。Sobel算子在图像处理中被广泛使用,特别是在计算机视觉和图像分析领域。 Sobel算子的原理 Sobel算子主要用于计…

zookeeper+kafka的消息队列

zookeeperKafka 两个都是消息队列的工具 消息队列 出现原因:生产者产生的消息与消费者处理消息的效率相差很大。为了避免出现数据丢失而设立的中间件。 在消息的生产者与消费之间设置一个系统,负责缓存生产者与消费者之间的消息的缓存。将消息排序。 优…

SpringMVC注解全解析:构建高效Web应用的终极指南 (上)

SpringMVC 是一个强大的 Web 框架,广泛应用于 Java Web 开发中。它通过注解简化了配置,增强了代码的可读性。本文将全面解析 SpringMVC 中常用的注解及其用法,帮助你构建高效的 Web 应用。 一. MVC介绍 MVC 是 Model View Controller 的缩写…

鸿蒙语言基础类库:【@system.bluetooth (蓝牙)】

蓝牙 说明: 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7 开始,该接口不再维护,推荐使用新接口[ohos.bluetooth]。本模块首批接口从API version…

反序列化漏洞详细介绍

反序列化漏洞详细介绍: 反序列化漏洞是软件开发中一个严重的安全问题,尤其在使用网络通信和持久化数据的应用中更为常见。下面是对反序列化漏洞的详细介绍: 原理 序列化是将对象的状态信息转换为可以存储或传输的格式(如字节流&#xff09…

【TAROT】韦特体系塔罗牌学习(2)——魔术师 THE MAGICIAN I

韦特体系塔罗牌学习(2)——魔术师 THE MAGICIAN I 目录 韦特体系塔罗牌学习(2)——魔术师 THE MAGICIAN I牌面分析1. 基础信息2. 图片元素 正位牌意1. 关键词/句2.爱情婚姻3. 学业事业4. 人际关系5. 其他象征意 逆位牌意1. 关键词…

python数据可视化(5)——绘制饼图

课程学习来源:b站up:【蚂蚁学python】 【课程链接:【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接:【链接】】 Python绘制饼图分析北京天气 饼图,是一个划分为几个扇形的圆形统计图表&#xff…

【网络世界】网络基础概念

目录 🌈 前言🌈 📁 什么是网络 📁 协议 📂 概念 📂 OSI参考模型 📂 TCP/IP模型 📂 TCP/IP 和 系统分层的关系 📁 网络传输的基本流程 📂 MAC地址 &#…

文件上传接口

文章目录 开发前端接口 开发前端接口 首先这个前端的文件上传组件使用了,前端组件 首先这个接口不是一般的接口,这个接口可以提取出来,之后那里使用了,就直接放到哪里 所以这是一个万能文件上传接口 写完之后选择 头像组件 在图库中添加组件 写前端组件之后,写了前端的组件…

WPF实现一个带旋转动画的菜单栏

WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目,如下所示 2、创建文件夹及文件 创建资源文件夹&…

Go: IM系统技术架构梳理

概述 整个IM系统的一般架构如下 我们这张图展示了整个IM系统的一般架构可见分为四层那最上面这一层是前端,包括哪些东西呢? 它包括两部分,第一部分是跟用户直接交互的比如说各种IOS APP, 各种安卓 APP还有各种 web APP 在浏览器里面打开的以…

区块链学习05-web3中solidity和move语言

Solidity 和 Move 语言的比较:Web3 开发中的两种选择 Solidity 和 Move 都是用于开发区块链平台智能合约的编程语言。它们具有一些相似之处,但也存在一些关键差异。 相似之处: Solidity 和 Move 都是图灵完备语言,这意味着它们可以表达计算…

Anything in Any Scene:无缝融入任何场景,实现逼真视频对象插入技术

现实世界的视频捕获虽然因其真实性而宝贵,但常常受限于长尾分布的问题,即常见场景过度呈现,而关键的罕见场景却鲜有记录。这导致了所谓的"分布外问题",在模拟复杂环境光线、几何形状或达到高度逼真效果方面存在局限。传…

CentOS配置时钟服务

一、ntp协议 1.1 基础 NTP(Network Time Protocol,网络时间协议)是用于同步计算机网络中各个设备时间的协议。 下面了解一下 ntp 的配置选项 1.) iburst 功能: 通过发送一组八个数据包来加速初始同步。 用法: server 0.pool.ntp.org i…