iOS程序猿iOS 开发每天分享优质文章专注iOS开发的小渣渣

OC底层探索14-方法名Type Encodings

2021-06-11  本文已影响0人  Henry________

在对cpp文件进行查看的时候,发现有一些特殊的符号很是常见,像这样的方法Sel-"v16@0:8"到底代表什么意义,这次决定把它搞搞清楚到底是什么。

查看Clang编译文件(.cpp)

//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 (真机)

cpp文件

Type 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个字节

上一篇 下一篇

猜你喜欢

热点阅读