| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> iOS-class方法和objc_getClass方法 -> 正文阅读 |
|
[移动开发]iOS-class方法和objc_getClass方法 |
根据上一篇博客iOS-class、object_getClass、objc_getClass、objc_getMetaClass区别的研究发现,发现主要还是class方法和objc_getClass方法的区别,因此本篇文章主要讲述一下class方法和objc_getClass方法。 一、Object(objc实例对象),Class(类),Metaclass(元类),Rootclass(根类),Rootclass‘s metaclass(根元类)首先说下Objective-C中类的几种数据结构;在Objective-C的类型结构中,Object(实例),Class(类),Metaclass(元类),Rootclass(根类),Rootclass‘s metaclass(根元类),且这些都是对象。 我们可用过两张图了解一下上述类型中的关系图 1、经典的Objective-C的对象模型图 2、?实例对象(Object),类(CLass),元类(Metaclass)之间的关系 实例对象(Object): 我们创建的一个对象或实例objc其实就是一个 类(CLass):存储Object实例的相关数据,如:实例方法列表、成员变量列表、属性列表。 元类(Metaclass):存储Class相关的数据,如:类方法列表、类的信息等。 参考苹果官方公开源码 二、class方法和objc_getClass方法1、class方法实例方法 -?(CLass)class; 类方法 + (Classs)class 在苹果公开的官方objc源码,NSObject.mm文件中:
2、object_getClass方法object_getClass(id _Nullable obj)? (1)传入参数:obj可能是instance对象、class对象、meta-class对象 (2)返回值: 【1】如果是instance对象,返回class对象 【2】如果是class对象,返回meta-class对象 【3】如果是meta-class对象,返回NSObject(基类)的meta-class对象 官方源码:
三、objc对象类型我们首先通过objc_getClass方法获取isa指针,即指向类对象的指针 objc_getMetaClass方法获取类对象中的isa指针,即指向元类对象的指针 代码如下:
输出结果: 1、obj为实例对象在Object-C中,Object本质上是一个struct,在这个struct中会保存一个名为isa的指针,该指针会指向该Object的类。定义如下所示:
我们初始化一个类的实例可以直接用 代码如下:
输出结果: 当obj为实例变量时 object_getClass(obj)与[obj class]输出结果一直,均获得isa指针,即指向类对象的指针。? 2、obj为Class类对象在Objective-C中,任何类的定义都是对象(除了int、char等这些基本类型)。类和类的实例(对象)没有任何本质上的区别。任何对象都有isa指针。 我们打开Xcode中?<
这个结构体其实就是我们所说的?类??,他的?
原来isa指针指向的依然是个? 代码如下:
输出结果: ?当obj为类对象时 object_getClass(obj)返回类对象中的isa指针,即指向元类对象的指针; [obj class]返回的则是类对象其本身 3、obj为Metaclass类(元类)对象Metaclass元类与Class的结构是一样的,只是职能不同。 类(CLass):存储Object实例的相关数据,如:实例方法列表、成员变量列表、属性列表。 元类(Metaclass):存储Class相关的数据,如:类方法列表、类的信息等。我们可以参考头部实例对象(Object),类(CLass),元类(Metaclass)之间的关系图解 代码如下:
输出结果: 当obj为Metaclass(元类)对象时 object_getClass(obj)返回元类对象中的isa指针,因为元类对象的isa指针指向根类,所有返回的是根类对象的地址指针; [obj class]返回的则是元类本身 4、obj为Rootclass类(根类)对象Rootclass就是根类,任何类的Metaclass中的isa指针都是指向根类。且结构与Class结构是一样的。 代码如下:
输出结果: 当obj为Rootclass(根类)对象时 object_getClass(obj)返回根类对象中的isa指针,因为根类对象的isa指针指向Rootclass‘s metaclass(根元类),即返回的是根元类的地址指针; [obj class]返回的则是其本身。 ?四、结论?1、object_getClass(obj)返回的是obj的isa指针 2、[obj class](1)obj为实例对象 (2)obj为类对象(包括元类和根类以及根元类) 这时候我们再回过头看看Object-C的对象模型图,思考一下会发现 1、内存创建一个instance实例对象(People *people),同时会创建一个与之对应的类对象(Class peopleClass)和元类对象(Class peopleMeta); 注:实例对象通过calloc可创建多个,但类对象和元类对象在内存中只有一份,只创建一次; 2、对象的本质,其实是C语言的结构体struct,各个对象的内存结构为: people:isa指针+仅存储Person类成员变量的值; People:isa指针+superclass指针+存储成员变量的类型、名称,协议,对象方法等; peopleMeta:isa指针+superclass指针+仅存储类方法; 3、isa指向: people:指向类对象People; People:指向元类对象peopleMeta; peopleMeta:指向基类(Root,如:NSObject)的元类对象meta(基类的元类对象的isa指向该元类对象自己); 4、superclass指向: People:指向父类>>基类的类对象指向nil; peopleMeta:指向父类>>基类的元类对象指向该基类的类对象; GitHub示例代码Demo参考文章: iOS笔记--class方法和objc_getClass方法 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 23:44:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |