Skip to main content
  1. Objective-C/

Objective-C的本质

·1 分钟
OC Objc
Objc - 系列文章之一
Part 4: 当前阅读
Objective-C底层实现其实都是C、C++代码,Objective-C的面向对象都是基于C、C++的数据结构实现的,Objective-C的对象、类主要是基于C、C++的结构体实现的。

Objective-C被翻译的过程

graph LR; A[OC]-->B[C\C++]; B-->C[汇编语言]; C-->D[机器语言]

Objective-C代码转换为C、C++代码

// 终端命令
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.c -o main.cpp
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc oc源文件 -o “输出cpp文件
一个OC对象在内存中是如何布局的?>

一个OC对象在内存中是如何布局的? #

// alloc 申请一块内存空间,init 初始化一个类的实例对象
NSObject *obj = [[NSObject alloc] init];

OC中对象至少会被分配16个字节的空间(64位);32位则是8个字节

COC32Bit64Bit
boolBOOL(64)11
charint8_t, BOOL(32)11
unsigned charboolean11
shortint16_t22
unsigned shortunichar22
intint32_t,NSInteger,boolean44
unsigned intboolean_t,NSUInteger44
longNSInteger48
unsigned longNSUInteger48
long longint64_t88
floatCGFloat(32)44
doubleCGFloat(64)88
参考>

参考 #

1、OC基本数据类型

关于NSObject对象的内存布局,看我就够了!

实时查看内存数据>

实时查看内存数据 #

DeBug > DeBug Workflow > View Memory,Shift + Command + M

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

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

一个对象至少需要8个字节

#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);
创建一个实例对象,实际分配了多少内存?>

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

64位系统至少会分配16个字节,32位则是8个字节。

#import <malloc/malloc.h>
NSObject *obj = [[NSObject alloc] init];
malloc_size((__bridge const void *)obj);
常用LLDB指令>

常用LLDB指令 #

print、p: 打印 po:打印对象

  • 读取内存
    • Memory read/数量格式字节数 内存地址
    • x/数量格式字节数 内存地址

💡 例如:x/3xw 0x10010

  • 格式
    • x是16进制,f是浮点数,d是10进制
  • 字节大小
    • b:byte 1字节
    • h:half wrod 2字节
    • w: word 4字节
    • g:giant word 8字节
  • 修改内存中的值
    • memory write 内存地址 数值:memory write 0x0000010 10


Objc - 系列文章之一
Part 4: 当前阅读