学习笔记-OC对象本质

2020-04-18  本文已影响0人  zhongli_007

1.Objective-C代码,底层实现其实都是C\C++代码
2.所有Objective-C的面向对象都是基于C\C++的数据结构实现的,Objc对象最终都是转化为C/C++的结构体

OC转C++代码可以通过xcode自带的命令完成

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

常用LLDB指令:

print、p:打印 
po:打印对象
x/数量+格式+字节数 内存地址 ( 格式(x:16进制 f:浮点 d:10进制)字节数(b:1字节 h:2字节 w:4字节 g:8字节))
例子: x/4xw  0x100504ed0 表示 每组4个字节以16进制表示打印4组0x100504ed0指向的内存区域。
memory write 内存地址 值 (例子:memory write 0x100504ed1 1f  :将0x100504ed1处的值改为1f)

一个NSObject实例对象大小是8个字节(isa指针),分配16个字节 证明:

 NSObject *obj = [[NSObject alloc]init];
//获得NSObject类的实例对象的大小
 NSLog(@"%zd",class_getInstanceSize([NSObject class]));
 //获得obj指针指向内存的大小
 NSLog(@"%zd",malloc_size((__bridge const void*)obj));

打印结果:8 16
窥探Objc源码:

//NSObject实际上转化为这种结构体,包含一个成员变量Class 而Class是一个结构体指针,而指针在64位系统中占用8个字节。所以实例对象大小是8个字节

struct NSObject_IMPL {
    Class isa;
};
typedef struct objc_class *Class;

#define NANO_MAX_SIZE           256 /* Buckets sized {16, 32, 48, ..., 256} */

64位苹果操作系统堆空间分配内存有内存对齐的概念:分配的内存是16的倍数


1.OC的对象分为:实例对象 , 类对象 ,元类对。存储结构:

他们之间的关系:


感谢总结这张图的大神,很清晰
上一篇 下一篇

猜你喜欢

热点阅读