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

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. laravel吐槽系列之一

    最近项目中经常使用到了laravel框架,对于这个框架之前只是弱弱地接触了一点,没有深入接触,这下有时间好好研究它了(主要是不得不研究了).说实话,laravel让我打开眼界了,之前对框架的使用一直停 ...

  2. 【转载】关于BooleanQuery在搜索中的用处

    我们在搜索中可能会遇到要搜索索引文件中不同字段,不同字段之间就存在了与或非的运算关系,如:这个xx字段中必须存在什么什么关键词,而另一个 XXX字段可以存在或不存在什么什么关键词等等等.这就需要有Bo ...

  3. ASP.NET MVC系列:为视图添加查询功能

    首先,在MoviesController里添加一个查询方法,代码如下 public ActionResult SearchIndex(string title) { //查询数据库中的电影表 var ...

  4. 【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)

    注:这里的服务是指Windows 服务. ------------------201508250915更新------------------ 刚刚得知TransactedInstaller类是支持带 ...

  5. Csharp: Create Excel Workbook or word from a Template File using aspose.Word 14.5 and aspose.Cell 8.1

    winform: /// <summary> /// /// </summary> /// <param name="sender"></ ...

  6. js定时器的使用(实例讲解)

    在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定 ...

  7. 孙鑫MFC学习笔记:15多线程

    15 1.进程地址空间 2.线程 3.CreateThread创建一个线程 4.CloseHandle关闭线程句柄,要在不再使用线程句柄的时候关闭,递减线程引用计数 5.编辑框默认不支持多行,需要打开 ...

  8. lua编译出so文件

    把lua编译出so文件 http://superuser.com/questions/557884/getting-error-recompile-with-fpic http://guiquanz. ...

  9. 容器--HashMap

    一.前言 看了下上一篇博客已经是半个月前,将近20天前了,很惭愧没有坚持下来,这期间主要是受奥运会和王宝强事件的影响,另外加上HashMap中关于rehash的实现比较不好理解,所以就一拖再拖.如果能 ...

  10. [转载]协程-cooperative multitasking

    [转载]协程三讲 http://ravenw.com/blog/2011/08/24/coroutine-part-1-defination-and-classification-of-corouti ...