clang -rewrite-objc的使用點滴

更多技術乾貨請戳:聽雲博客css

clang -rewrite-objc的做用是把oc代碼轉寫成c/c++代碼,咱們經常使用它來窺探OC的一些祕密。 ios

一、最簡單的例子c++

main.m的代碼以下: web

int main(int argc, char * argv[]) { 
    int i=1 ;
    __blockint j=0;
    void(^aBlock)(void)=^{ 
        j+=2*i;
    };
    aBlock();
    return 0; 
}

打開終端,來到main.m所在目錄,執行以下命令: xcode

clang -rewrite-objc main.m

執行以後,目錄下多出一個main.cpp文件,打開一看,一兩百行代碼。其關鍵代碼以下: iphone

1.png

這個例子是用來研究block的原理的,在網上能搜到,本文無心解釋這些代碼。 ui

二、指定SDKspa

有的oc代碼要轉成c代碼時,在真機和模擬器上差異仍是挺大的。若是須要指定SDK,那麼要結合xcrun命令,例如指定真機: code

xcrun -sdk iphoneos clang -rewrite-objc main.m

若是要指定模擬器: blog

xcrun -sdk iphonesimulator clang -rewrite-objc main.m

模擬器和真機都有默認的SDK版本,也能夠指定具體某版本: 

xcrun -sdk iphonesimulator9.3 clang -rewrite-objc main.m

固然,你要先看看你機器上都裝哪些SDK,xcodebuild命令能夠完成這個任務:

2.png

三、指定framework

若是使用了第三SDK,例如(main.m文件): 

#import <UIKit/UIKit.h> 
#import "AppDelegate.h"
#import <tingyunApp/NBSAppAgent.h>//第三方SDK,聽雲的SDK
int main(int argc, char * argv[]) { 
    @autoreleasepool {
        [NBSAppAgent startWithAppID:@"xxxxxxxxxxxxxx」];//啓動聽雲的SDK
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegateclass]));
    } 
}

代碼中使用了聽雲的SDK,這時運行clang -rewrite-objc ,結果以下: 

3.png

出錯了,忘記引入聽雲的這個framework了,clang不知到何處去找,這時須要用-F開關告訴它。 

tingyunApp.framework在/Users/goanywhere/Downloads/nbs-newlens-ios-2.3.6下,因而修改指令爲: 
xcrun -sdk iphonesimulator9.3 clang -rewrite-objc –F      /Users/goanywhere/Downloads/nbs-newlens-ios-2.3.6  main.m

執行命令,OK,成功了。 

以上示例都是爲了儘量簡單,實際上能夠同時指定多個源文件、多個framework。 

分享即快樂。

原文連接:http://blog.tingyun.com/web/article/detail/845 

相關文章
相關標籤/搜索