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 指针。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sublime 资源汇总

2019独角兽企业重金招聘Python工程师标准>>> 《sublime text2使用经验》:里面插件的推介和使用、截图。《Sublime Text 2 入门及技巧》:技巧,可惜是4年前的东西了。《Sublime Text 2安装插件方法详解》:介绍了使用 GoA…

c汇编语言程序框架培训,[010][x86汇编语言]学习用户程序的编写(c08.asm)

源程序来源加载程序c08_mbr.asm用户源程序:增加注释;;文件名:c08-2.asm;文件说明:用户程序;创建日期:13:08 2018/5/23;----------------------------------------------------------------------SECTION header vstart0 ;定义用户…

白--留白与游戏设计

我所谓之白,非颜色之白,乃设计之白,思想之白也。 我对白的理解得益于对日本传统艺术与现代设计的些许了解,前几日偶得日本设计业前辈原研哉先生的一本书《白》。阅后颇有所思,不禁联想至游戏行业。白,也可称间或空。是日本艺术创造中一直沿承的一种创作思…

文件共享服务器搭建

详细需求描述1、网络拓扑图如下:2、利用虚拟机实现网络拓扑,要求如下(1)虚拟机环境使用hostonly(2)服务器要求:安装Widnwos Server 2008 R2操作系统内存要求:750MB安装五块物理SCSI磁…

当c语言老师遇到网络崩溃,网络教学搞不定?工科教授来支招!

新学期已经到来但是由于新冠病毒肆虐我们不得不在“线上会面”网络远程教学颠覆了传统课堂模式的同时,也为教员们的教学工作带来极大的挑战。想想看,面对一个计算机屏幕滔滔不绝地讲上90分钟,确实需要大量的准备工作。网课平台怎么选&#xf…

[20150629]12c物化视图刷新Out of place

[20150629]12c物化视图刷新Out of place.txt --11G物化视图刷新有1个参数atomic_refresh. --如果为false,采用的方式是truncate,再使用/* append */ 提示insert。这样redo最少,但是刷新期间无法访问。 --如果为true,采用的方式是d…

VBScript学习笔记 - 数组

数组声明 dim var(10) 数组声明指出了数组名和索引(index)的最大值。数组索引从0开始。因此该语句创建一个11个元素的数组,其中值为var(0), var(1), …和var(10) 遍历数组的所有元素 可用for each循环,不需事先指明数组中元素的个数。如果不想处理每一个…

android logo在线生成工具,在线生成logo

在线生成logo是一款为大家提供logo设计的手机服务软件,平台上面的logo设计都是基于AI技术提供的,然后再搭配上一些创意,平台上面会根据用户的行业及喜好来提供6款的成品logo,用户可以从中选择一款自己最喜欢的进行定稿&#xff0c…

在JS函数中执行C#中的函数、字段

1、调用字段 cs文件的代码&#xff1a; public int id 0;protected void Page_Load(object sender, EventArgs e){id 2;} View Codejs页面的代码&#xff1a; function CheckFunc() {alert("<% id%>");} View Code2、调用函数&#xff1a; 在JS函数中访问或执…

任意阶幻方(魔方矩阵)C语言实现

魔方又称幻方、纵横图、九宫图&#xff0c;最早记录于我国古代的洛书。据说夏禹治水时&#xff0c;河南洛阳附近的大河里浮出了一只乌龟&#xff0c;背上有一个很奇怪的图形&#xff0c;古人认为是一种祥瑞&#xff0c;预示着洪水将被夏禹王彻底制服。后人称之为"洛书&quo…

android防谷歌滑动效果,谷歌是如何做到这一点的?在Android应用程序中滑动ActionBar...

事实上&#xff0c;有一种方法可以做到这一点。即使没有实施自己的ActionBar。看看hierachyviewer吧&#xff01;(位于工具目录中)还有的DecorView&#xff0c;并且LinearLayout作为一个孩子。这LinearLayout包含ActionBar其他内容和其他内容。所以&#xff0c;你可以简单地应用…

thinkphp框架使用心得

接触的第一个PHP框架就是TP&#xff0c;在使用的了一段时间后就放弃了&#xff0c;说实话TP的弊端挺多&#xff0c;之后又接触laravel框架&#xff0c;慢慢的就爱上laravel这个框架了。这段时间由于公司的原因&#xff0c;又不得不使用thinkphp框架,在这里分享下使用心得。 TP框…

计算本年 本月 本周的起始日期

html: <table><tr><td align"right" width"120px"> 销售时间区间:</td><td><select id"ddlChoiceDate" name"ddlChoiceDate" runat"server" onchange"SelectChange(this.value);&quo…

Android查看真机布局,android-外部存储

外部存储&#xff0c;个人理解是在app作用域之外存储&#xff0c;就是数据没有和app做关联&#xff0c;app卸载后&#xff0c;它依旧存在而不再是之前手机本身存储空间和sd卡的区别&#xff0c;现在安卓手机已经不携带可拆卸的SD卡androidManifest.xml 需要写入读写权限简单布局…

用自己的ID在appstore中更新app-黑苹果之路

由于之前套用了别人的镜像&#xff0c;在appstore中更新XCode时总要输别人id的密码&#xff0c;id还不能改。网上有的说要把XCode删掉&#xff0c;然后再用自己的ID更新&#xff0c;找到另外一个方法&#xff0c;更简单&#xff1a; 1.打开引用程序目录 2.找到Xcode&#xff0c…

如何打开pr_debug调试信息

转载&#xff1a;http://blog.csdn.net/helloanthea/article/details/25330809 以DMA的调试为例&#xff0c;先来看看一个pr_debug函数调用 pr_debug("%s: %s (%s)\n",__func__,chan ? "success" : "fail",chan ? dma_chan_name(chan) : NULL)…

android国籍组件,android组件化之路

问题&#xff1a;实际业务变化快&#xff0c;而工程内各个功能模块耦合度太高&#xff0c;不能对功能模块进行快速方便地拆分或组装。团队共同开发中&#xff0c;可能一个文件同时被多人修改&#xff0c;导致每次更新提交代码都需要消耗大量时间去merge代码。每次修改&#xff…

UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数...

lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序)。对于这种信号的系统默认动作是忽略它。 在文档“进程控制三部曲”中,我们讲的第三部曲是使用 wait 函…

poj2750 PottedFlower(线段树的环状操作)

题目&#xff1a;Potted Flower 大意&#xff1a;该你一个换环&#xff0c;求环上的最大连续的和&#xff08;如果最大和包含所有数&#xff0c;要求减去最小的一个&#xff09;。 思路&#xff1a;这道题的思路并不难&#xff0c;需要在线段树里维护区间的最大和&#xff0c…

android代码导入有错误,android新项目导入后进行编译出现cmake错误

问题描述使用as加载并且gradle sync 提示&#xff1a;SIMPLE:error configure同时使用make project提示问题出现的环境背景及自己尝试过哪些方法已经尝试更换过ndk 调整target brinary 然后完全clean project等操作相关代码// 请把代码文本粘贴到下方(请勿用图片代替代码)使用g…