美文网首页
Object-C的本质

Object-C的本质

作者: 男儿心 | 来源:发表于2020-05-28 15:52 被阅读0次

我们平时编写的Objective-C代码,底层实现其实都是C\C++代码

编译顺序

所以Objective-C的面向对象都是基于C\C++的数据结构实现的;那么 Objective-C的对象、类主要是基于C\C++的什么数据结构实现的?

答案是结构体,因为只有结构体能存储不同类型的对象。下面我们一步一步验证一下,NSObject 对象的本质是不是就是结构体,需要先将oc代码转成c/c++代码

转换之前我们需要指定一个具体系统以及架构,就以iphone的64位架构来区分,补充一点是模拟器的架构是i386、32bit是arm7、64bit是arm64,所以我们需要执行的代码是

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp

然后生成一个main-arm64.cpp对应的c/c++代码,在 main-arm64.cpp 内我们可以找到NSObject_IMPL这个结构体,它就是NSObject的具体实现;因为结构体内只有一个isa成员,所以isa的地址就是当前结构体在内存中的地址,所以obj指针中存储的地址就是isa的地址值。

接下来,延伸一到面试题

问:一个NSObject 对象占用多少内存?

打印结果

我们可以看到 malloc_size 返回的的确是16个字节,那么为什么class_getInstanceSize 返回的是8呢?通过查看源码注释我们知道,其实class_getInstanceSize返回的是对象成员变量所占用的大小,但是系统分配的内存的时候,如果你的内存大小小于16,那么会按照16个字节来分配。

答:系统分配了16个字节给NSObject对象,但是NSObject对象内部只使用了8个字节的空间(64bit环境下)

相关文章

  • 面试中: 一个NSObject对象占用多少内存?

    答案是:16个字节 Object-C的本质 Object-C -> C\C++ -> 汇编语言 -> 机器语言 所...

  • Object-C的本质

    我们平时编写的Objective-C代码,底层实现其实都是C\C++代码 所以Objective-C的面向对象都是...

  • Object-C中类与对象的本质

    通过几道面试题我们来逐渐解开类与对象的本质。 Object-C的本质 我们平时编写的Objective-C(后面简...

  • Object-C对象本质

    Object-C对象本质 OC中对象类型 instance 实例对象isa指针其他成员变量 class 类对象is...

  • Object-C 方法调用的本质

    结论 OC中方法调用的本质就是发送消息 验证结论 在main.m文件中有这么一段代码,这是一段很常见的方法调用,使...

  • Effective Object-C 52:1-5

    一、熟悉Object-C Object-C : 基于C语言基础 + 面向对象特性。 1.了解Object-C 的起...

  • block的本质

    1)block:本质就是一个object-c对象. block:存储位置,可能分为3个地方:代码去,堆区、栈区(A...

  • Block为什么使用copy?

    block:本质就是一个object-c对象block:存储位置,可能分为3个地方:代码去,堆区、栈区(ARC情况...

  • 2018-07-13

    Object-c对象本质上就是一个结构体 NSObject所占内存的大小就是结构体指针所占的大小, 64bit 从...

  • iOS

    一、Object-c试题总结: 1、Object-c的类可以多继承么?可以实现多个接口么? 答:Object-c的...

网友评论

      本文标题:Object-C的本质

      本文链接:https://www.haomeiwen.com/subject/gkdaahtx.html