背景:
由于要看runtime的底层,自己下载了官方的源码(objc4-750.tar.gz),结果编译各种报错。😭😭😭
自己搭建好完整的项目github
下面是本人搭建的过程:
参考链接:
1.最新Runtime源码objc4-750编译
2.objc - 编译Runtime源码objc4-680
-
准备工作
-
其他所需要的库(下载地址点我)
objc4-33.png
-
将所有下载的压缩包全部解压到一个文件夹(暂且定为libs,可以直接放在桌面哟)里面(待会儿用搜索来查找缺失的文件)
-
Xcode打开<i>objc.xcodeproj</i>工程文件
-
编译Objc
-
问题1
objc4-1.jpg- 解决 objc4-2.jpg
-
问题2
objc4-3.png- 解决 首先在工程的根目录下创建include文件夹,再在该文件夹下创建一个sys文件夹(因为报错的就是#include<sys/reason.h>)
objc4-4.png - 在libs文件夹里面搜索reason.h,将其拖入sys文件夹里面
- 在工程文件里面进行配置:($(SRCROOT)/include) objc4-5.png
- 解决 首先在工程的根目录下创建include文件夹,再在该文件夹下创建一个sys文件夹(因为报错的就是#include<sys/reason.h>)
-
问题3
objc4-6.png- 解决 类似问题2,创建文件夹、搜索文件、拖入文件 objc4-7.png
-
问题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- 解决 出现了重复定义了 这里我是把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
-
问题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)里的内容macosx.internal改为macosx
objc4-29.png
-
-
问题19
objc4-30.png-
解决把Target-objc的Build Settings->Other Text-Based InstallAPI Flags里的内容设为空,把Text-Based InstallAPI Verification Model里的值改为Errors Only
objc4-31.png
-
-
-
总的路径如下
objc4-34.png
使用:
我们在自己建的工程 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实例对象的成员变量所占用的大小 >> 8
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
//获得obj指针所指向内存的大小 >> 16
//malloc_size(const void *ptr):Returns size of given ptr
NSLog(@"%zd", malloc_size((__bridge const void *)obj));
}
return 0;
}
测试:激动人心的时刻
网友评论