clang 查看OC实现

clang命令

clang rewrite-objc

由于想了解OC通过runtime机制转成的C++代码是什么样子的,在进入项目目录中,执行cc -rewrite-objc ViewController.m时如下错:

In file included from ViewController.m:9:
./ViewController.h:9:9: ****fatal error: ****'UIKit/UIKit.h' file not found

import

** ^**
1 error generated.

fuck
'UIKit/UIKit.h' file not found的错。
但最终还是摸索出解决办法,就是使用:

clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk xxxxx.m
当然,不能每次都输入这么长的路径和命令,可通过alias简化工作,步骤:

进入终端,键入命令 vim ~/.bash_profile
在vim界面输入i进入编辑编辑状态并且键入:alias rewriteoc='clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk'
键入完毕,点esc退出编辑状态,再键入:wq退出vim并保存,执行source ~/.bash_profile <-这句一定要执行,执行才会生效

进入到工程目录 找到需要重新查看的文件 执行下面命令
rewriteoc main.m

clang -rewrite-objc 的作用是把oc代码转写成c/c++代码,常用它来查看OC的底层实现。
1.基本使用
//使用命令行进入main.m的目录,执行下面的命令
clang -rewrite-objc main.m
//会产生一个main.cpp文件
2.查看机器上装有的的sdk
xcodebuild -showsdks
iOS SDKs:
iOS 11.1 -sdk iphoneos11.1

iOS Simulator SDKs:
Simulator - iOS 11.1 -sdk iphonesimulator11.1

macOS SDKs:
macOS 10.13 -sdk macosx10.13

tvOS SDKs:
tvOS 11.1 -sdk appletvos11.1

tvOS Simulator SDKs:
Simulator - tvOS 11.1 -sdk appletvsimulator11.1

watchOS SDKs:
watchOS 4.1 -sdk watchos4.1

watchOS Simulator SDKs:
Simulator - watchOS 4.1 -sdk watchsimulator4.1
3.具体情况
//指定真机
xcrun -sdk iphoneos clang -rewrite-objc main.m

//指定模拟器
xcrun -sdk iphonesimulator clang -rewrite-objc main.m

//指定SDK版本
xcrun -sdk iphonesimulator10.3 clang -rewrite-objc main.m

//指定framework
xcrun -sdk iphonesimulator11.1 clang -rewrite-objc -F /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks main.m

你可能感兴趣的:(clang 查看OC实现)