什么是ObjCTypes?

简介: 什么是ObjCTypes?

先看一下消息转发流程:
消息转发流程
在forwardInvocation这一步,你必须要实现一个方法:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");

该方法用于说明消息的返回值和参数类型。NSMethodSignature是方法签名,它是用来记录返回值和参数类型的一个对象。看一下与该类相关的方法:


//在NSMethodSignature.h中
+ (nullable NSMethodSignature *)signatureWithObjCTypes:(const char *)types;   //1

//在NSObject.h中
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");  //2

+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");   //3

2和3两个方法是根据SEL来构造NSMethodSignature,而1方法则是今天的主角,那里面的types究竟是什么呢?
根据1的方法名称可以猜想,types是ObjCTypes,它是一个是字符串数组,该数组包含了方法的类型编码。那如果我们用该方法实例化NSMethodSignature的时候究竟如何写types呢?先来举个例子:

- (void)goToSchoolWithPerson:(Person *)person;

[zhangsan goToSchoolWithPerson:lisi];

其ObjcTypes就是 "v@:@"。那究竟是如何得来该字符串呢?其实我们有两种方式:

  1. 直接查表。在Type Encodings里面列出了对应关系。
  2. 使用 @encode()计算。( NSLog(@"%s",@encode(BOOL))的结果为B )

我们都知道消息发送会被转换成objc _ msgSend(id reciever,SEL sel,prarams1,params2,....)。所以上面的方法会被转换成:

void objc_msgSend(zhangsan,@selector(goToSchoolWithPerson:),lisi);   //包含两个隐藏参数

这里的 “v@:@”就代表:

  • "v":代表返回值void
  • "@":代表一个对象,这里指代的id类型zhangsan,也就是消息的receiver
  • ":":代表SEL
  • "@":代表参数lisi

再举个例子:


- (BOOL)ifSuccess:(NSString *)tag

其ObjCTypes为:"B@:@",其中:

  • "B":代表BOOL。 // NSLog(@"%s",@encode(BOOL))的结果为B
  • "@":一个id类型的对象,第一个参数类型,也就是objc _ msgSend的第一个参数
  • ":":代表对应的SEL,第二个参数
  • "@":一个id类型的对象,也就是tag。

到此,我们就知道了该如何书写ObjCTypes了。

1.Type Encodings

相关文章
|
4月前
|
Ubuntu Linux 开发工具
ubuntu linux搭建lvgl
ubuntu linux搭建lvgl
160 6
|
编解码 数据可视化 Go
clusterProfiler:单细胞-DE富集item 去冗余
本分分享了 clusterProfiler软件包根据术语相似分数去冗余 富集通路的用法, 以供参考学习
231 0
|
安全 Ubuntu Unix
2022渗透测试-最好用的权限提升方法-CVE-2021-4034
2022渗透测试-最好用的权限提升方法-CVE-2021-4034
2022渗透测试-最好用的权限提升方法-CVE-2021-4034
|
前端开发 程序员 C#
程序人生 - 这几门语言可能要被淘汰了!
程序人生 - 这几门语言可能要被淘汰了!
149 0
程序人生 - 这几门语言可能要被淘汰了!
|
弹性计算 大数据 应用服务中间件
投稿有礼 | “轻量应用服务器”征文活动全新升级
更高的奖励,更好的福利,欢迎分享你和轻量应用服务器的故事
投稿有礼 | “轻量应用服务器”征文活动全新升级
|
Swift
数组
数组
154 0
数组
|
自然语言处理 Swift iOS开发
iOS混淆工具
简介: 争取做一款最好的代码混淆工具,模拟人工手动混淆,识别上下文 ,支持继承链、类型识别、方法多参等复杂高级混淆。
2832 0
iOS混淆工具
|
iOS开发 C++
iOS 类的加载分析 (中)
我们都知道iOS的整体机制是懒加载, 也是就是使用到, 再去加载, 不使用就释放掉来节省内存.
100 0
|
缓存 前端开发 JavaScript
CDN缓存相关问题及命中率优化
本文详细介绍旅CDN缓存命中率的概念,分析了无法命中缓存的问题原因以及命中率降低影响因素,并针对命中率降低及如何优化做了分析和介绍。
2718 0
CDN缓存相关问题及命中率优化
|
移动开发 前端开发 JavaScript
编程语言排行榜 - 2020年度最热门编程语言盘点!
工欲善其事,必先利其器。业务需求的满足,离不开移动应用框架、工具和编程语言。为了简化和加快整个开发进程,下面让我们一起来探究一下,那些对于移动应用开发人员和业务服务来说,至关重要且需要谨慎选择的最佳编程语言。
编程语言排行榜 - 2020年度最热门编程语言盘点!