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

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文件,打开一看,一两百行代码。其关键代码如下:

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

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 ,结果如下:

出错了,忘记引入听云的这个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

clang -rewrite-objc的使用点滴的更多相关文章

  1. 打造基于Clang LibTooling的iOS自动打点系统CLAS(三)

    1. 源码变换 第一章我们提到过,CLAS的本质是对源码做一次非常简单的变换(有些文章里称作变形),即Source-Source-Transformation,将打点代码精确地插入到目标函数的首部,保 ...

  2. Clang教程之实现源源变化

    clang教程之实现源源变化 声明:本教程来自于Eli Bendersky's website 原文地址:http://eli.thegreenplace.net/2014/05/01/modern- ...

  3. Block 在 ARC 下的拷贝

    前言 现在有一种说法,是开启arc选项时,已经没有栈上的block了,所以所有的block都不需要copy来拷贝到堆上了.那么这个说法正确与否呢? 结论是这个说法必须是错误的,首先的一点就是arc只是 ...

  4. objc@interface的设计哲学与设计技巧

    blog.sunnyxx.com 我是前言 学习objc时,尤其是先学过其他编程语言再来看objc时,总会对objc的类声明的关键字interface感到有点奇怪,在其它面向对象的语言中通常由clas ...

  5. “Clang” CFE Internals Manual---中文版---"Clang"C语言前端内部手册

    原文地址:http://clang.llvm.org/docs/InternalsManual.html 译者:史宁宁(snsn1984) "Clang"C语言前端内部手册 简介 ...

  6. clang 编译 OC

    clang -fobjc-arc -framework Foundation helloworld.m -o helloworld.out OVERVIEW: clang LLVM compiler ...

  7. @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify

    首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...

  8. clang format 官方文档自定义参数介绍(中英文)

    官方文档:http://clang.llvm.org/docs/ClangFormatStyleOptions.html 中文 在代码中配置样式 当使用 clang::format::reformat ...

  9. ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify

    首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...

随机推荐

  1. shell的历史

    shell的历史 shell概况 人想要和操作系统进行交互,传送指令给操作系统,就需要使用到shell.宏义的shell是人与机器交互的页面,它分为两种,一种是有界面的,比如GUI,另外一种是没有界面 ...

  2. 安装thrift

    要求 thrift至少需要支持三种语言: Java PHP Go 预安装 基本教程: http://thrift.apache.org/docs/install/centos 使用最新的thrift, ...

  3. IOS开发技巧快速生成二维码

    随着移动互联网的发展,二维码应用非常普遍,各大商场,饭店,水果店 基本都有二维码的身影,那么ios中怎么生成二维码呢? 下面的的程序演示了快速生成二维码的方法: 在ios里面要生成二维码,需要借助一个 ...

  4. shell脚本二

    在shell脚本一 中,我讨论了shell脚本的语法规范,shell脚本的变量,以及shell脚本的测试语句. 仅仅懂得这些只能写简单的脚本,在简单的脚本中各条语句按顺序执行,从而实现自动化的管理,顺 ...

  5. 开发ASP.NET MVC设置统一的命名空间

    当你创建一个全新的ASP.NET MVC专案之后,你想设置统一的命名空间,从可以下面几次入手. 首先设置专案的属性: 第二步,打开Views/Web.config文件,修改: 第三步,修改路由文件的命 ...

  6. lua学习之table类型

    关系表类型,这是一个很强大的类型.我们可以把这个类型看作是一个数组.只是 C语言的数组,只能用正整数来作索引: 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是 nil.同样,在C语言中 ...

  7. 基于Ionic2的开源项目

    项目介绍 基于Ionic2的Ionic中文论坛客户端,该应用也是边学边做的,为了将更多常用东西加入到APP中,有些逻辑不通之处,敬请包涵. 开源地址 https://github.com/zxj963 ...

  8. LCA---Tarjan算法

    本问题中Tarjan算法不需要设置栈和dfn,low标号,而是设置了并查集. 通过一次dfs遍历即可找出所有节点对的lca.将这样一次读取所有查询,计算一次后返回所有查询lca的算法称为离线算法 涉及 ...

  9. Oracle数据库,内置函数小结

    1.聚合函数 count(字段) // 求非空行的数量 max(字段) // 获取最大值 sum(字段) //求和 avg(字段) // 平均值 min(字段) // 最小值 2.转换函数 to_da ...

  10. Runtime获取一个类中所有成员变量的名字和类型