面试题:一个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);
网友评论