• clang -rewrite-objc的使用点滴


    更多技术干货请戳:听云博客

    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();
        return 0; 
    }

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

    clang -rewrite-objc main.m

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

    1.png

    这个例子是用来研究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命令可以完成这个任务:

    2.png

    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 {
            [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 

  • 相关阅读:
    poi隐藏列
    凯西太太的果园
    java中不可变对象深入理解
    excel添加空白行的快捷键
    如何在多个页面中,引入一个公共组件
    对后端返回的数据进行适配
    我与时间管理的故事
    在前端团队的那些日子(初见)
    我是这样做时间管理的(下)
    我是这样做时间管理的(上)
  • 原文地址:https://www.cnblogs.com/TingyunAPM/p/5620426.html
Copyright © 2020-2023  润新知