c语言的class,Objective-C中Class的本质
类(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的本质相关推荐
- StructBERT:将语言结构纳入深度语言理解的预训练中——中文翻译
STRUCTBERT:将语言结构纳入深度语言理解的预训练中 Wei Wang, Bin Bi, Ming Yan, Chen Wu, Zuyi Bao, Jiangnan Xia, Liwei Pen ...
- 活动推荐:语音和语言技术在自然交互中的实践沙龙
智能语音技术已经渗透进家居生活.车载.金融服务等日常生活场景,在很大程度上解放了人们的双手和眼睛,语音交互成为连接人与信息/服务的新入口.根据IDC预测,国内对话式人工智能市场规模将在2022年达到7 ...
- R语言str_trim函数去除字符串中头部和尾部的空格
R语言str_trim函数去除字符串中头部和尾部的空格 目录 R语言str_trim函数去除字符串中头部和尾部的空格 #导入包和库 #仿
- R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体)
R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体) 目录
- R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型、分类预测器(分类变量)被自动替换为一组虚拟编码变量、summary函数查看检查模型、使用table函数计算混淆矩阵评估分类模型性能
R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型(Logistic regression).分类预测器(分类变量)被自动替换为一组虚拟编码变量.summary函数查看检查模型.使用t ...
- R语言ggplot2在可视化图像中添加横线并在横线中添加文本、为横线中添加的文本添加文本框、自定义文本框的填充色(background color for a text annotation)
R语言ggplot2在可视化图像中添加横线并在横线中添加文本.为横线中添加的文本添加文本框.自定义文本框的填充色(background color for a text annotation) 目录
- R语言str_extract函数从字符串中抽取匹配模式的字符串
R语言str_extract函数从字符串中抽取匹配模式的字符串 目录 R语言str_extract函数从字符串中抽取匹配模式的字符串 #导入包和库
- R语言str_sub函数从字符串中提取或替换子字符串(substring):str_sub函数指定起始位置和终止位置抽取子字符、str_sub函数指定起始位置和终止位置替换子字符串
R语言str_sub函数从字符串中提取或替换子字符串(substring):str_sub函数指定起始位置和终止位置抽取子字符.str_sub函数指定起始位置和终止位置替换子字符串 目录
- R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置y轴的标签文本使用粗体字体)
R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置y轴的标签文本使用粗体字体) 目录
- R语言ggplot2可视化:jupyter中设置全局图像大小、jupyter中自定义单个ggplot2图像结果的大小
R语言ggplot2可视化:jupyter中设置全局图像大小.jupyter中自定义单个ggplot2图像结果的大小 目录
最新文章
- python词云有什么用_如何用Python实现词云效果
- MySQL高级 - 案例 - AOP记录日志
- mpvue微信小程序http请求-fly.js
- htmlentities在mysql_PHP和mySQL:何时确切使用htmlentities?
- 「开源·共创·照亮」TDengine开源两周年暨灯塔计划发布会邀你一起闪耀
- chips cope_Android P:Chips and ChipGroup
- 去政府办事,最好事先联系,避免换了地方
- 【直接下载】x86_64-6.3.0-release-win32-seh-rt_v5-rev2
- MATLAB破解版解决帮助文档需要许可证的问题
- 游戏类型英文简称/全称对照表
- 熊猫分发_熊猫实用指南
- RBGA8888转nv21
- kde调整分辨率_7个很酷的KDE调整将改变您的生活
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)...
- [Java实战][仅需1步]企业微信群机器人[0基础接入]
- 计数器/定时器8253/8254
- mysql pxc搭建_MySQL PXC 高可用集群搭建
- 张宇高数 第一讲 极限(思维导图)
- 菌体浓度测定方法/细菌计数方法
- OpenCV的三维重建实现方案