前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >NSObject_IMPL 是 NSObject 类的编译后的结构体

NSObject_IMPL 是 NSObject 类的编译后的结构体

原创
作者头像
艳艳代码杂货店
修改于 2021-09-26 01:39:28
修改于 2021-09-26 01:39:28
5010
举报
  • NSObject 类被编译成了 NSObject_IMPL 的结构体。
  • Person 类被编译成了 Person_IMPL 的结构体。
  • Person 类的内部还增加了一个 NSObject_IMPL 的结构体
    • 我们知道 Person 继承于 NSObject, 所以它的底层实现中是第一个成员是父类的结构体,就是底层继承的实现方式。用这样的方式拥有父类所有的成员变量。
    • NSObject_IMPL 是 NSObject 类的编译后的结构体,它的内部只有一个 Class 类型的 isa 成员变量。我们知道 isa 是 isa_t 类型的,那为什么在这里定义成 Class 类型呢?这是为了更加直观的提现出它代表的是类的信息,所以在获取isa 的方法中,将它强制转换成了Class 类型, 代码如下:

    inline Class objc_object::ISA() {

...

return (Class)(isa.bits & ISA_MASK)

}

总结:

1.类的底层实现是结构体。

2.继承是通过把父类的结构体声明为本类结构体的第一个成员变量实现的。

isa_t 的类型

联合体: 所有成员可以是不同的类型,但是公用一块内存区域,设置了一个成员变量就会覆盖另一个成员变量的数据。优点是节省空间。

union isa_t { //联合体

isa_t() { }

isa_t(uintptr_t value) : bits(value) { }

//提供了cls 和 bits ,两者是互斥关系

Class cls;

uintptr_t bits;

#if defined(ISA_BITFIELD)

struct {

ISA_BITFIELD;  // defined in isa.h

};

#endif

};

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS底层—OC对象的本质与isa
我们已经学习了对象的初始化、内存对齐等内容。这篇文章将深入学习探究对象的本质、对isa进行分析。
CC老师
2022/01/11
5980
iOS底层—OC对象的本质与isa
OC底层探索06-isa本身藏了多少信息你知道吗?OC底层探索06-isa本身藏了多少信息你知道吗?
一直都说类最终都会编译为struct,可是怎么验证呢?编译后的结构体内部都会有些什么东西呢?
用户8893176
2021/08/09
3830
OC底层探索06-isa本身藏了多少信息你知道吗?OC底层探索06-isa本身藏了多少信息你知道吗?
对象原理探究(二)
结构体(struct)或者联合体(union)的数据成员,第一个数据成员会放在offset为0的地方,之后的每个数据成员存储的起始位置要从该成员大小(如果该成员有子成员,比如数组、结构体等,那么就从子成员大小)的整数倍开始。
拉维
2021/03/10
4090
对象原理探究(二)
isa 指针走向
作为一个 iOSer, 都知道NSObject 是基类, 肯定都听说过一句话: 万物皆对象, NSObject 类的第一个成员就是 isa 指针, 这个就不展示源码了, 这个指针存着类的很多信息, 而不仅仅是指向类内存的指针.
CC老师
2022/03/15
5910
isa 指针走向
神经病院Objective-C Runtime入院第一天—isa和Class
我第一次开始重视Objective-C Runtime是从2014年11月1日,@唐巧老师在微博上发的一条微博开始。
一缕殇流化隐半边冰霜
2018/08/30
8300
神经病院Objective-C Runtime入院第一天—isa和Class
iOS系统源码思考:对象的引用计数存储在哪里?--从runtime源码得到的启示
iOS开发者都知道OC里面的内存管理是通过对象的引用计数来管理的,或手动MRC,或自动ARC,有些操作可以让引用计数加1,有些可以减1,一旦一个对象的引用计数为0,就回收内存了。
陈满iOS
2018/09/10
6.1K0
iOS系统源码思考:对象的引用计数存储在哪里?--从runtime源码得到的启示
isa详解(一)isa结构
为什么要用union以及位运算呢。因为在计算机中为二进制。位运算是最快速的计算方式 union C++ 中的共用体。顾名思义 就是在union 中 公用一个内存地址 。
老沙
2019/09/28
1.5K0
深入浅出 Runtime(二):数据结构
Objective-C的面向对象都是基于C/C++的数据结构——结构体实现的。 我们平时使用的所有对象都是id类型,id类型对象对应到runtime中,就是objc_object结构体。
师大小海腾
2020/04/16
8430
OC对象原理(二)
上面的代码中,如果我们覆写了该类的allocWithZone方法,那么就会走到第31行的逻辑;不过一般而言我们是不会自己去覆写allocWithZone方法的,所以一般都会走第8~28行的逻辑。
拉维
2021/10/20
7650
iOS底层原理总结 - 探寻Runtime本质(一)
isa的本质 在学习Runtime之前首先需要对isa的本质有一定的了解,这样之后学习Runtime会更便于理解。 回顾OC对象的本质,每个OC对象都含有一个isa指针,__arm64__之前,isa仅仅是一个指针,保存着对象或类对象内存地址,在__arm64__架构之后,apple对isa进行了优化,变成了一个共用体(union)结构,同时使用位域来存储更多的信息。 我们知道OC对象的isa指针并不是直接指向类对象或者元类对象,而是需要&ISA_MASK通过位运算才能获取到类对象或者元类对象的地址。今天来
xx_Cc
2018/06/19
9400
OC类的原理探究(一)
前面两篇文章介绍了OC对象的原理,以及一些分析的思路和方法,今天开始,将开启类的原理探究。
拉维
2021/03/10
4820
OC类的原理探究(一)
OC类的原理(一)
前面两篇文章介绍了OC对象的原理,以及一些分析的思路和方法,今天开始,将开启类的原理探究。
拉维
2021/10/20
5910
IOS底层原理之NSObject的结构
在OC程序中,我们知道NSObject是“万物之源”,所有的类的都继承自NSObject,我们疑惑的是在OC的底层NSObject是什么样的?
CC老师
2022/01/12
7280
IOS底层原理之NSObject的结构
(1)Objective-C的本质
众说周知,我们平时编写的OC代码,底层都是C/C++实现的 我们可以通过一个终端指令,将我们的OC代码转换成C/C++代码 xcrun -sdk iphoneos clang -arch arm64
czjwarrior
2018/05/28
3960
面试驱动技术之 - isa && 元类 && 函数调用
以MNPerson为例,里面的成员变量有不同类型是,比如int、double、NSString 类型,假如在C/C++ 中用数组存储,显然是不太合理的
小蠢驴打代码
2019/01/28
9670
面试驱动技术之 - isa && 元类 && 函数调用
ios 底层原理 : 类与类结构分析
类的分析 类的分析主要是分析 isa 的走向与继承关系 准备 创建两个类 1.继承自 NSObject 的 LGPerson @interface LGPerson : NSObject { NSString *hobby; } @property(nonatomic,copy)NSString * lg_name; - (void)sayHello; + (void)sayBye; @end @implementation LGPerson - (void)sayHello { } +
conanma
2021/10/28
6650
iOS - 老生常谈内存管理(四):内存管理方法源码分析
建议去掘金查看本文,带目录方便阅读。 《iOS - 老生常谈内存管理(四):内存管理方法源码分析》
师大小海腾
2020/04/24
2.3K0
iOS底层原理总结 - 探寻Class的本质
iOS底层原理总结 - 探寻Class的本质 对小码哥底层班视频学习的总结与记录。面试题部分,通过对面试题的分析探索问题的本质内容。 上接 iOS底层原理总结 - 探寻OC对象的本质 Class的本质 我们知道不管是类对象还是元类对象,类型都是Class,class和mete-class的底层都是objc_class结构体的指针,内存中就是结构体,本章来探寻Class的本质。 Class objectClass = [NSObject class]; Class objectMetaCla
xx_Cc
2018/05/10
8520
Object Runtime -- Weak
第一部分:借用 Xcode 找到与 weak 有关的所有内容,并进行整理和归纳,推导出核心的数据结构和方法集。
半纸渊
2019/04/01
1.3K0
runtime的那些事(二)——NSObject数据结构
 在使用 Objective-C 语言中创建的所有类基类,绝大部分都是继承自 NSObject(NSProxy除外,上文已经有过说明,runtime的那些事(一)——runtime基础介绍。因此想要深入学习 iOS 底层知识,NSObject 类拿来开刀再合适不过了(一脸正经:哈哈哈(ಡωಡ)hiahiahia) 首先,进入查看 NSObject 类结构
我只不过是出来写写代码
2019/05/15
9450
runtime的那些事(二)——NSObject数据结构
推荐阅读
相关推荐
iOS底层—OC对象的本质与isa
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档