1.Objective-C代碼惨恭,底層實現(xiàn)其實都是C\C++代碼
2.所有Objective-C的面向?qū)ο蠖际腔贑\C++的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,Objc對象最終都是轉(zhuǎn)化為C/C++的結(jié)構(gòu)體
OC轉(zhuǎn)C++代碼可以通過xcode自帶的命令完成
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
常用LLDB指令:
print钦椭、p:打印
po:打印對象
x/數(shù)量+格式+字節(jié)數(shù) 內(nèi)存地址 ( 格式(x:16進(jìn)制 f:浮點(diǎn) d:10進(jìn)制)字節(jié)數(shù)(b:1字節(jié) h:2字節(jié) w:4字節(jié) g:8字節(jié)))
例子: x/4xw 0x100504ed0 表示 每組4個字節(jié)以16進(jìn)制表示打印4組0x100504ed0指向的內(nèi)存區(qū)域风瘦。
memory write 內(nèi)存地址 值 (例子:memory write 0x100504ed1 1f :將0x100504ed1處的值改為1f)
一個NSObject實例對象大小是8個字節(jié)(isa指針)扑媚,分配16個字節(jié) 證明:
NSObject *obj = [[NSObject alloc]init];
//獲得NSObject類的實例對象的大小
NSLog(@"%zd",class_getInstanceSize([NSObject class]));
//獲得obj指針指向內(nèi)存的大小
NSLog(@"%zd",malloc_size((__bridge const void*)obj));
打印結(jié)果:8 16
窺探Objc源碼:
//NSObject實際上轉(zhuǎn)化為這種結(jié)構(gòu)體甚淡,包含一個成員變量Class 而Class是一個結(jié)構(gòu)體指針淤年,而指針在64位系統(tǒng)中占用8個字節(jié)苟蹈。所以實例對象大小是8個字節(jié)
struct NSObject_IMPL {
Class isa;
};
typedef struct objc_class *Class;
#define NANO_MAX_SIZE 256 /* Buckets sized {16, 32, 48, ..., 256} */
64位蘋果操作系統(tǒng)堆空間分配內(nèi)存有內(nèi)存對齊的概念:分配的內(nèi)存是16的倍數(shù)
1.OC的對象分為:實例對象 , 類對象 ,元類對横蜒。存儲結(jié)構(gòu):
他們之間的關(guān)系:
感謝總結(jié)這張圖的大神胳蛮,很清晰