美文网首页
底层1:OC对象本质

底层1:OC对象本质

作者: 张无奈 | 来源:发表于2020-08-26 08:57 被阅读0次

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

系统分配了16个字节给NSObject对象(通过malloc_size函数获得),但是NSObject对象内部只使用了8个字节的空间(64bit环境)。

NSObject *obj = [[NSObject alloc]init];

通过导入运行时#import <objc/runtime.h> 打印class_getInstanceSize([NSObject class])获取(8个字节)的是NSObject类的实例对象的大小,malloc_size(obj)获取obj指针所指向内存的大小。

我们平时编写的Objective-C代码,底层实现其实都是C/C++代码。再转化为汇编语言。

Objective-C --> C/C++代码 -- > 汇编语言 --> 机器语言

所以Objective-C的面向对象都是基于C/C++的数据结构实现的。

思考:Objective-C的对象,类主要是基于C/C++的什么数据结构实现的?

结构体(个人理解:结构体里面可以包含多种类型元素,这跟我们用oc创建成员变量时可以有各种类型是比较相似)

将oc代码转化为C/C++代码

clang -rewrite-objc main.m -o main.cpp (该命令是将main.m文件中的oc代码转化为c++代码,cpp就是c plus plus,clang是编译器 )

 xcrun -sdk iphoneos -arch arm64 -rewrite-objc main.m 

什么平台上的代码,不同平台支持的代码不一样,window,mac,ios。模拟器(i386)、32bit(armv7)、64bit(arm64)

NSObject的底层实现

@interface NSObject{

Class isa;

}

struct NSObject_IMPL{

Class isa;

}

下载查看源码:opensource.apple.com.tarballs/

两个容易混淆的概念:

创建一个实例对象,至少需要多少内存?

#import<objc/runtime.h>

class_getInstanceSize([NSObject class]);

创建一个实例对象,实际分配了多少没存?

#import<malloc/malloc.h>

malloc_size((__bridge const void *)obj);

相关文章

网友评论

      本文标题:底层1:OC对象本质

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