答案是:16个字节
Object-C的本质
Object-C->C\C++->汇编语言->机器语言
所以
Objective-C的面向对象都是基于C\C++的数据结构实现的
思考:Objective-C的对象、类主要是基于C\C++的什么数据结构实现的?
结构体
OC验证
- 代码
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSObject *obj = [[NSObject alloc] init];
}
return 0;
}
-
将Objective-C代码转换为C\C++代码
不同平台支持的代码不一样
| 平台 |
|---|
| Windows |
| Mac |
iOS |
iOS平台下架构 |
|---|
模拟器i386
|
32bit armv7
|
64bit arm64
|
| 参数 | 说明 |
|---|---|
| xcrun | 使用 xcode 工具 |
| -sdk | 支持平台 |
| clang | 编译器 |
| -arch | 架构 |
| -rewrite-objc | 重写OC文件 |
| -o | 输出路径,CPP(c++) |
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o main-arm64.cpp
- main-arm64.cpp中
// NSObject 在内存中,就是此结构体
struct NSObject_IMPL {
Class isa;
};
- 结构体中的Class
// 就是指向这个结构体的指针
typedef struct objc_class *Class;
- 既然是指针
在
32位架构中,指针是占用4个字节
在64位架构中,指针是占用8个字节
// 由此,我们分析
// NSObject*obj=[[NSObject alloc]init]的代码本质
[[NSObject alloc] init];
等于
struct NSObject_IMPL {
Class isa;
};
---------------------------------------------
NSObject *obj 存储开辟的这个NSObject对象的内存地址
obj 就是 isa的地址
如上所知NSObject对象是8个字节,我们在用代码验证一下
NSObject *obj = [[NSObject alloc] init];
// 获得NSObject实例对象的成员变量所占用的大小
// 打印结果 8
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
// 获得obj指针所分配内存的大小
// 打印结果 16
NSLog(@"%zd", malloc_size((__bridge const void *)obj));
我们的问题是占用,所以是分配了多少内存,所以是16
当我们创建NSObject对象,会分配给我们16个字节,但我们实际利用中,只用到了8个字节














网友评论