在对cpp文件进行查看的时候,发现有一些特殊的符号很是常见,像这样的方法Sel-"v16@0:8"
到底代表什么意义,这次决定把它搞搞清楚到底是什么。
//Clang默认依赖Foundation库
//当前目录下:把目标文件编译成c++文件.pp
clang -rewrite-objc main.m -o main.cpp
//编译目标文件内有UIKit等其他库需要导入依赖,
clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot / Applications/Xcode.app/Contents/Developer/Platforms/ iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.0.sdk main.m
//使用`xcode`安装安装的`xcrun`命令
xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp (真机)
方法sel的一种简式表达
,但是具体是代表什么呢?@encode(##)
,内建函数来获取各个类型的Encodings。-(void)say1{} //oc
{(struct objc_selector *)"say1", "v16@0:8", (void *)_I_HRTest_say1} //cpp
v:返回值为空 16:共占用16字节内存空间 @:代表第一个参数self(每一个方法都会有一个默认参数self) 0:第一个参数从第0号位置开始 : :方法的Sel(方法名) 8:SEL从第8号位置开始
{(struct objc_selector *)"name", "@16@0:8", (void *)_I_HRTest_name} //cpp
第一个@:返回值为id类型 16:共占用16字节内存空间 第二个@:代表第一个参数self(每一个方法都会有一个默认参数self) 0:第一个参数从第0号位置开始 : :方法的Sel(方法名) 8:SEL从第8号位置开始
{(struct objc_selector *)"setAge:", "v20@0:8i16", (void *)_I_HRTest_setAge_} //cpp
v:返回值为空 20:共占用20字节内存空间 @:代表第一个参数是id类型-self(每一个方法都会有一个默认参数self) 0:第一个参数从第0号位置开始 : :方法的Sel(方法名) 8:SEL从第8号位置开始 i:第二个参数是int类型,代表传入参数 16:第二个参数从16号位置开始-20号位置,共占4个字节