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

作者: Henry________ | 来源:发表于2021-06-11 12:40 被阅读0次

在对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文件

  • 通过观察发现是方法sel的一种简式表达,但是具体是代表什么呢?

Type Encodings

  • 这是在appleDevelop官网上找到的。
  • 除了这种方式还可以通过@encode(##),内建函数来获取各个类型的Encodings。

具体意义

  • 方法会自带两个参数:self、方法名(cmd);

  • 例一

-(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号位置开始


  • 例二,系统生成的get方法
{(struct objc_selector *)"name", "@16@0:8", (void *)_I_HRTest_name} //cpp

第一个@:返回值为id类型
16:共占用16字节内存空间
第二个@:代表第一个参数self(每一个方法都会有一个默认参数self)
0:第一个参数从第0号位置开始
: :方法的Sel(方法名)
8:SEL从第8号位置开始


  • 例三,系统生成的set方法
{(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个字节

相关文章

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

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

  • iOS 的Type Encodings

    iOS 的Type Encodings Type Encodings compiler 编码encode 每个me...

  • iOS 类型编码(Type Encodings)

    Type Encodings

  • Type Encodings

    Type Encodings Apple Type Encodings 就是编译器把 method 的参数列表和返...

  • 2021 iOS底层提升计划

    iOS底层提升方案 下方学习大纲大家可以参考学习《OC底层、核心编程探索》专栏的索引。 OC底层探索 OC对象占用...

  • Type Encodings

    为了帮助运行时系统,编译器将每个方法中的返回值类型和参数类型进行编码,并将方法名和方法选择器进行关联。编译器通过@...

  • Type Encodings

    @encode,@编译器指令 之一,返回一个给定类型编码为一种内部表示的字符串(例如,@encode(int) →...

  • Type Encodings

    Type Encodings 在使用消息转发的时候,我们经常会用到到这个方法methodSignatureForS...

  • iOS底层原理探索—class的本质

    探索底层原理,积累从点滴做起。大家好,我是Mars。上文iOS底层原理探索—OC对象的本质中总结了OC对象的底层原...

  • iOS底层原理探索—内存管理(一)

    探索底层原理,积累从点滴做起 往期回顾 iOS底层原理探索 — OC对象的本质 iOS底层原理探索 — class...

网友评论

    本文标题:OC底层探索14-方法名Type Encodings

    本文链接:https://www.haomeiwen.com/subject/eczmeltx.html