看很多的大牛在博客里寫的runtime各種原理實(shí)現(xiàn),剖析各種實(shí)現(xiàn)。直接使用clang來(lái)獲取c++源碼,但是自己實(shí)踐的情況下總是在一些細(xì)節(jié)問題,例如:
clang -rewrite-objc xxx.m
這個(gè)就是一個(gè)由.m 轉(zhuǎn)換為.cpp文件的clang命令,但是自己實(shí)際操作時(shí)是這樣子的:

頓時(shí)一陣抓狂,難道是我操作有問題?不應(yīng)該啊,好多的博客都是這樣的,但是具體的是為什么不行呢?遂在Google上找到各種類似的解決辦法,但都沒有對(duì)癥下藥,無(wú)論嘗試那種辦法都報(bào)'UIKit/UIKit.h' file not found的錯(cuò)。
這個(gè)具體事為什么呢?
實(shí)在想不到更好的方式,只能是慢慢思考這個(gè)問題,從字面意思來(lái)說(shuō)就是依賴的庫(kù)并沒有找到。那這樣的思路是不是就是依賴一下相應(yīng)的庫(kù)就可以呢?依賴的庫(kù)也都是xcode自動(dòng)打包好的,但是在xcode的目錄下是有相應(yīng)的sdk的。所以進(jìn)行一下試想將sdk一起加入到編譯中。由此從網(wǎng)上找了一些關(guān)于類似的方式:
clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk xxxxx.m
實(shí)踐結(jié)果如下

很遺憾,這種方式還是存在一些問題,仔細(xì)查看相關(guān)報(bào)錯(cuò)信息:

這個(gè)UIWebview在Mac下是不可用的。既然不讓這么粗暴的方式調(diào)用,突然想起熟悉又陌生的xcrun,那么結(jié)合xcrun呢?xcrun只有之前寫自動(dòng)化測(cè)試腳本的時(shí)候用到過,知道他的強(qiáng)大。完全可以使用這個(gè)工具完成這個(gè)編譯工作,一頓操作過后......
// 模擬器的情況下
xcrun -sdk iphonesimulator clang -rewrite-objc xxx.m
//真機(jī)的情況下
xcrun -sdk iphoneos clang -rewrite-objc xxx.m
效果如下:

真香定理,到此,這么一個(gè)簡(jiǎn)單的命令操作完畢,可以繼續(xù)分析相關(guān)的底層實(shí)現(xiàn)原理。其實(shí)大部分mac下的開發(fā),根據(jù)報(bào)錯(cuò)信息經(jīng)過分析信息都可以分析個(gè)八九不離十,在結(jié)合上面向百度編程的思路,大部分都是沒啥問題。如果沒有報(bào)錯(cuò)信息是最坑的。下次在繼續(xù)寫一下最近遇到的坑。