我們平時編寫的Objective-C
代碼尼摹,底層實現(xiàn)其實都是C\C++
代碼,Objective-C的面向?qū)ο蠖际腔?code>C\C++的結構體
來實現(xiàn)的辆童。所以我們所寫的Objective-C
代碼最終都會轉成C\C++
代碼,再由C\C++
代碼轉成匯編語言
代碼儿咱,最后再轉成機器語言
混埠。
相同的一份代碼在轉成C\C++
代碼時诗轻,對于不同平臺所生成的代碼是不一樣的,再轉成匯編語言
時不同平臺也是不一樣的吏颖,而且匯編語言是完全依賴于硬件的半醉,不同的硬件環(huán)境所生成的的匯編語言完全不一樣。
我們可以通過終端命令來將Objective-C
代碼轉成C\C++
代碼呆奕。首先在終端將當前目錄移動到OC文件所在目錄衬吆,main.m的OC代碼轉成main.cpp的c++代碼:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp
-
xcrun
表示利用xcode工具逊抡。 -
-sdk iphoneos
用于指定SDK秦忿,表示說生成的c++代碼是運行在iPhone上的灯谣。 -
clang
是蘋果的clang編譯器潜秋。 -
-arch arm64
是指定架構,對于iOS平臺胎许,模擬器的架構是i386
峻呛,32位機器的架構是armv7
,64位機器的架構是arm64
辜窑。 -
-rewrite-objc aaa.m
表示重寫aaa.m文件的代碼钩述。 -
-o bbb.cpp
表示重寫的代碼輸出為c++代碼并保存再bbb.cpp文件中。
如果運行上面命令報錯xcrun: error: SDK "iphoneos" cannot be located
穆碎,那我們需要先運行下面這條命令來給Xcode命令行工具指定路徑:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
比如main.m
文件的代碼如下:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
}
return 0;
}
轉換成c++
文件后代碼有幾萬行牙勘,把代碼拉到最下面就可以看到main函數(shù)轉換后對應的c++
代碼,代碼如下:
int main(int argc, const char * argv[]) {
/* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;
Person *person = ((Person *(*)(id, SEL))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init"));
}
return 0;
}