背景:
由于要看runtime的底層,自己下載了官方的源碼(objc4-750.tar.gz),結(jié)果編譯各種報(bào)錯(cuò)。??????
自己搭建好完整的項(xiàng)目github
下面是本人搭建的過程:
參考鏈接:
1.最新Runtime源碼objc4-750編譯
2.objc - 編譯Runtime源碼objc4-680
準(zhǔn)備工作
-
其他所需要的庫(下載地址點(diǎn)我)
objc4-33.png 將所有下載的壓縮包全部解壓到一個(gè)文件夾(暫且定為libs,可以直接放在桌面喲)里面(待會(huì)兒用搜索來查找缺失的文件)
Xcode打開<i>objc.xcodeproj</i>工程文件
-
編譯Objc
-
問題1
objc4-1.jpg-
解決objc4-2.jpg
-
解決
-
問題2
objc4-3.png- 解決 首先在工程的根目錄下創(chuàng)建include文件夾,再在該文件夾下創(chuàng)建一個(gè)sys文件夾(因?yàn)閳?bào)錯(cuò)的就是#include<sys/reason.h>)
objc4-4.png - 在libs文件夾里面搜索reason.h,將其拖入sys文件夾里面
-
在工程文件里面進(jìn)行配置:($(SRCROOT)/include)objc4-5.png
- 解決 首先在工程的根目錄下創(chuàng)建include文件夾,再在該文件夾下創(chuàng)建一個(gè)sys文件夾(因?yàn)閳?bào)錯(cuò)的就是#include<sys/reason.h>)
-
問題3
objc4-6.png-
解決 類似問題2,創(chuàng)建文件夾、搜索文件、拖入文件objc4-7.png
-
解決 類似問題2,創(chuàng)建文件夾、搜索文件、拖入文件
-
問題4
objc4-8.png
(類似問題2) -
問題5
objc4-9.png
(類似問題2) -
問題6
objc4-10.png
(類似問題2) -
問題7
objc4-11.png
刪除了bridgeos(3.0) -
問題8
objc4-12.png
注意是machine/cpu_capabilities.h
(類似問題2) -
問題9
objc4-13.png
注意是os/tsd.h(類似問題2) -
問題10
objc4-14.png
(類似問題2) -
問題11
objc4-15.png
objc4-16.png- 解決 出現(xiàn)了重復(fù)定義了 這里我是把pthread_machdep.h文件里面的給注釋掉的(詳見demo)
-
問題10
objc4-17.png
注意是BlocksRuntime/Block_private.h(類似問題2) -
問題11
objc4-18.png
(類似問題2) -
問題12
objc4-19.png- 解決在 dyld_priv.h 文件中:添加
#define DYLD_MACOSX_VERSION_10_11 0x000A0B00 #define DYLD_MACOSX_VERSION_10_12 0x000A0C00 #define DYLD_MACOSX_VERSION_10_13 0x000A0D00 #define DYLD_MACOSX_VERSION_10_14 0x000A0E00 -
問題13
objc4-20.png-
解決(類似問題2:文件路徑見下)objc4-21.png
-
解決(類似問題2:文件路徑見下)
-
問題14
objc4-22.png
注意是private/_simple.h(類似問題2) -
問題15
objc4-23.png-
解決:改一下工程配置文件:
Build Settings->Preprocessor Macros(Debug & Release)加入:LIBC_NO_LIBCRASHREPORTERCLIENT
objc4-35.png
-
-
問題16
objc4-24.png- 解決 改一下工程配置: Build Settings->Linking->Order File,改成$(SRCROOT)/libobjc.order
objc4-25.png
- 解決 改一下工程配置: Build Settings->Linking->Order File,改成$(SRCROOT)/libobjc.order
-
問題17
objc4-26.png-
解決:在 Build Settings -> Linking -> Other Linker Flags里刪掉"-lCrashReporterClient"(Debug和Release都刪了)
objc4-27.png
-
-
問題18
objc4-28.png-
解決把Target-objc的Build Phases->Run Script(markgc)里的內(nèi)容macosx.internal改為macosx
objc4-29.png
-
-
問題19
objc4-30.png-
解決把Target-objc的Build Settings->Other Text-Based InstallAPI Flags里的內(nèi)容設(shè)為空,把Text-Based InstallAPI Verification Model里的值改為Errors Only
objc4-31.png
-
-

-
總的路徑如下
objc4-34.png
使用:


我們?cè)谧约航ǖ墓こ?main.m 文件里
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSObject *obj = [[NSObject alloc] init];
//獲得NSObject實(shí)例對(duì)象的成員變量所占用的大小 >> 8
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
//獲得obj指針?biāo)赶騼?nèi)存的大小 >> 16
//malloc_size(const void *ptr):Returns size of given ptr
NSLog(@"%zd", malloc_size((__bridge const void *)obj));
}
return 0;
}
測試:激動(dòng)人心的時(shí)刻


































