转载

clang -rewrite-objc的使用点滴

如需转载请联系听云College团队成员小尹 邮箱:yinhy#tingyun.com

clang -rewrite-objc的作用是把oc代码转写成c/c++代码,我们常用它来窥探OC的一些秘密。

1、最简单的例子

main.m的代码如下:

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

打开终端,来到main.m所在目录,执行如下命令:

clang -rewrite-objc main.m

执行之后,目录下多出一个main.cpp文件,打开一看,一两百行代码。其关键代码如下:

clang -rewrite-objc的使用点滴

这个例子是用来研究block的原理的,在网上能搜到,本文无意解释这些代码。

2、指定SDK

有的oc代码要转成c代码时,在真机和模拟器上差别还是挺大的。如果需要指定SDK,那么要结合xcrun命令,例如指定真机:

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

如果要指定模拟器:

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

模拟器和真机都有默认的SDK版本,也可以指定具体某版本:

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

当然,你要先看看你机器上都装哪些SDK,xcodebuild命令可以完成这个任务:

clang -rewrite-objc的使用点滴

3、指定framework

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

#import <UIKit/UIKit.h>  #import "AppDelegate.h" #import <tingyunApp/NBSAppAgent.h>//第三方SDK,听云的SDK int main(int argc, char * argv[]) {      @autoreleasepool {         [NBSAppAgentstartWithAppID:@"xxxxxxxxxxxxxx”];//启动听云的SDK         returnUIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegateclass]));     }  }

代码中使用了听云的SDK,这时运行clang -rewrite-objc ,结果如下:

clang -rewrite-objc的使用点滴

出错了,忘记引入听云的这个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
正文到此结束
Loading...