类(class)和元类(meta-class)底层都是 objc_class 结构体的指针,内存中就是结构体。

struct objc_class {

Class _Nonnull isa OBJC_ISA_AVAILABILITY;

#if !__OBJC2__

Class _Nullable super_class OBJC2_UNAVAILABLE;

const char * _Nonnull name OBJC2_UNAVAILABLE;

long version OBJC2_UNAVAILABLE;

long info OBJC2_UNAVAILABLE;

long instance_size OBJC2_UNAVAILABLE;

struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;

struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;

struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;

struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;

#endif

} OBJC2_UNAVAILABLE;

之前没有注意到 OBJC2_UNAVAILABLE(眼瞎啊!!!),最近才注意到,这部分结构体已经弃用了,那新的是什么样?有变化吗?变化大吗?抱着这些问题,一起往下看。

源码下载地址

注意:因源码结构体太长,以下是部分截取

objc-runtime-new.h文件中

struct objc_class : objc_object {

// Class ISA;

Class superclass;

cache_t cache; // formerly cache pointer and vtable

class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags

class_rw_t *data() {

return bits.data();

}

void setData(class_rw_t *newData) {

bits.setData(newData);

}

发现这里是一个继承关系,objc_class 继承自 objc_object,先放放,后面会提到。

这里的 superclass 和 cache,很容易看明白,可是 class_rw_t 是什么?

struct class_rw_t {

// Be warned that Symbolication knows the layout of this structure.

uint32_t flags;

uint32_t version;

const class_ro_t *ro;

method_array_t methods; // 方法列表

property_array_t properties; // 属性列表

protocol_array_t protocols; // 协议列表

此结构体存放着我们熟悉的 方法列表、属性列表、协议列表 等。

那 const class_ro_t *ro; 这个又是什么鬼?

struct class_ro_t {

uint32_t flags;

uint32_t instanceStart;

uint32_t instanceSize; // 事例对象大小

#ifdef __LP64__

uint32_t reserved;

#endif

const uint8_t * ivarLayout;

const char * name; // 类名

method_list_t * baseMethodList;

protocol_list_t * baseProtocols;

const ivar_list_t * ivars; // 成员变量

const uint8_t * weakIvarLayout;

property_list_t *baseProperties;

method_list_t *baseMethods() const {

return baseMethodList;

}

};

此结构体存放着 实例对象大小、类名、成员变量 等。

objc-private.h文件中

struct objc_object {

private:

isa_t isa;

public:

// ISA() assumes this is NOT a tagged pointer object

Class ISA();

// getIsa() allows this to be a tagged pointer object

Class getIsa();

isa 指针出现了,看到这就明白了,因为 objc_class 继承自 objc_object,所以 objc_class 也拥有 isa 指针。

c语言的class,Objective-C中Class的本质相关推荐

  1. StructBERT:将语言结构纳入深度语言理解的预训练中——中文翻译

    STRUCTBERT:将语言结构纳入深度语言理解的预训练中 Wei Wang, Bin Bi, Ming Yan, Chen Wu, Zuyi Bao, Jiangnan Xia, Liwei Pen ...

  2. 活动推荐:语音和语言技术在自然交互中的实践沙龙

    智能语音技术已经渗透进家居生活.车载.金融服务等日常生活场景,在很大程度上解放了人们的双手和眼睛,语音交互成为连接人与信息/服务的新入口.根据IDC预测,国内对话式人工智能市场规模将在2022年达到7 ...

  3. R语言str_trim函数去除字符串中头部和尾部的空格

    R语言str_trim函数去除字符串中头部和尾部的空格 目录 R语言str_trim函数去除字符串中头部和尾部的空格 #导入包和库 #仿

  4. R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体)

    R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体) 目录

  5. R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型、分类预测器(分类变量)被自动替换为一组虚拟编码变量、summary函数查看检查模型、使用table函数计算混淆矩阵评估分类模型性能

    R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型(Logistic regression).分类预测器(分类变量)被自动替换为一组虚拟编码变量.summary函数查看检查模型.使用t ...

  6. R语言ggplot2在可视化图像中添加横线并在横线中添加文本、为横线中添加的文本添加文本框、自定义文本框的填充色(background color for a text annotation)

    R语言ggplot2在可视化图像中添加横线并在横线中添加文本.为横线中添加的文本添加文本框.自定义文本框的填充色(background color for a text annotation) 目录

  7. R语言str_extract函数从字符串中抽取匹配模式的字符串

    R语言str_extract函数从字符串中抽取匹配模式的字符串 目录 R语言str_extract函数从字符串中抽取匹配模式的字符串 #导入包和库

  8. R语言str_sub函数从字符串中提取或替换子字符串(substring):str_sub函数指定起始位置和终止位置抽取子字符、str_sub函数指定起始位置和终止位置替换子字符串

    R语言str_sub函数从字符串中提取或替换子字符串(substring):str_sub函数指定起始位置和终止位置抽取子字符.str_sub函数指定起始位置和终止位置替换子字符串 目录

  9. R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置y轴的标签文本使用粗体字体)

    R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置y轴的标签文本使用粗体字体) 目录

  10. R语言ggplot2可视化:jupyter中设置全局图像大小、jupyter中自定义单个ggplot2图像结果的大小

    R语言ggplot2可视化:jupyter中设置全局图像大小.jupyter中自定义单个ggplot2图像结果的大小 目录

最新文章

  1. python词云有什么用_如何用Python实现词云效果
  2. MySQL高级 - 案例 - AOP记录日志
  3. mpvue微信小程序http请求-fly.js
  4. htmlentities在mysql_PHP和mySQL:何时确切使用htmlentities?
  5. 「开源·共创·照亮」TDengine开源两周年暨灯塔计划发布会邀你一起闪耀
  6. chips cope_Android P:Chips and ChipGroup
  7. 去政府办事,最好事先联系,避免换了地方
  8. 【直接下载】x86_64-6.3.0-release-win32-seh-rt_v5-rev2
  9. MATLAB破解版解决帮助文档需要许可证的问题
  10. 游戏类型英文简称/全称对照表
  11. 熊猫分发_熊猫实用指南
  12. RBGA8888转nv21
  13. kde调整分辨率_7个很酷的KDE调整将改变您的生活
  14. Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)...
  15. [Java实战][仅需1步]企业微信群机器人[0基础接入]
  16. 计数器/定时器8253/8254
  17. mysql pxc搭建_MySQL PXC 高可用集群搭建
  18. 张宇高数 第一讲 极限(思维导图)
  19. 菌体浓度测定方法/细菌计数方法
  20. OpenCV的三维重建实现方案

热门文章

  1. 只用一套解决方案,就可解决80%的交通物流行业信息难题
  2. day10:函数进阶
  3. Docker 二进制安装docker
  4. token的三点注意项
  5. SPOJ 694/705 后缀数组
  6. SpringMVC+Shiro权限管理
  7. POJ 1323 Game Prediction#贪心
  8. Vim高级使用 - CentOS下使用VIM打造C/C++开发环境
  9. Google Earth 和MS Virtual Earth:虚拟地球简介
  10. 台湾邮政历史常设展重新开幕