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

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. .NET平台下开源框架

    一.AOP框架Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(asp ...

  2. C#语法糖(Csharp Syntactic sugar)大汇总

    首先需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕 ...

  3. 《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)

    从现在开始相关文章请到: http://lko2o.com/moon 接着上一篇:<ASP.NET SignalR系列>第三课 SignalR的支持平台 一.概述 SignalR常常依托于 ...

  4. PhotoKit框架介绍及使用

    PhotoKit 是一套比 AssetsLibrary 更新更完整也更高效的ios照片处理库,对资源的处理跟 AssetsLibrary 有很大的不同.下面简单介绍下PhotoKit的几个基本概念 P ...

  5. 五、BLE(下)

    1.1       GATT server Service 通过走读代码, GATT Server作为一个GATT service,我是没有发现其发挥了多大功能,其负责处理的消息GATT_SERVER ...

  6. 浅谈图片蒙版效果-webkit-mask

    会用PS的童鞋一定知道“蒙版”的概念,它可以在图片上实现一定的遮罩效果,当然这里我们不介绍ps里的蒙版,而是介绍利用CSS3的新属性-webkit-mask来实现网页中的图片遮罩效果. 大家对-web ...

  7. java实现可有括号的android计算器

    写了一个android版的计算器,可以计算带括号的表达式,不过前提是:正确的表达式才行 小缺陷是没有做表达式括号的控制,现在还没有想到好的控制方式 package javaAdvanced; impo ...

  8. QTableWidget的美化

      FriendTable->setFrameShape(QFrame::NoFrame);  //设置边框 FriendTable->setHorizontalHeaderLabels( ...

  9. VC中实现文字竖排的简单方法

    好多人都觉得在VC中实现文字竖排是一件很难的事情,其实可以使用“躺”着的字体很方便的实现文字竖排. Windows中有一些字体是“躺”着的,例如:@Fixedsys.@System.@宋体.@黑体等等 ...

  10. LeetCode121:Best Time to Buy and Sell Stock

    题目: Say you have an array for which the ith element is the price of a given stock on day i. If you w ...