先看一下消息转发流程:

在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

转载于:https://www.cnblogs.com/zhanggui/p/8251011.html

什么是ObjCTypes?相关推荐

  1. iOS之深入解析如何使用Block实现委托方法

    一.前言 Block 和 Delegate 是对象间传递消息的常用机制,这两个机制可以说是各有千秋. Delegate 可以很方便把目标动作的执行过程划分为多个方法,以展现不同时间节点下特定的操作:B ...

  2. Aspects swift 源代码分析

    steipete/Aspects 的设计,挺高深莫测的 一般我们 hook, hook 一个类的所有实例的方法 这里 hook 的粒度,到了对象级别 而且不需要建立,大量的 IMP 利用到了固有的方法 ...

最新文章

  1. cordova 安装ssl证书_cordova环境配置(android)
  2. iphone 使用popViewController如何避免内存泄露
  3. redis延迟消息队列不准时php,Redis实现延迟消息队列
  4. 安徽计算机应用基础高考试题,安徽省对口高考试题(计算机应用基础部分)
  5. ubuntu 14.04.03 LTS(64bit) 安装PyCharm
  6. “呵呵呵”之后 B站又申请了“一键三连”商标
  7. IDEA下Springcloud框架搭建(一)之服务注册与发现
  8. c大小写转换函数_字符处理——大小写转换编程思路扩展
  9. OpenGL基础25:多光源(附简单GLSL配置)
  10. 14.go build
  11. java做一个万年历和闹钟,c51实现万年历、温度与闹钟功能程序
  12. 2021秋招IC验证面经-ARM中国/中科芯/飞腾/地平线/中兴
  13. 数值计算(四)——插值法(3)Hermite插值法
  14. SRP记录_20190418
  15. 国家开放大学计算机网络技术毕业设计,精编国家开放大学毕业论文:购物网站设计...
  16. 【历史上的今天】10 月 4 日:计算机先驱阿塔纳索夫出生;卡巴斯基创始人诞生;谷歌推出 Google Pixel 手机
  17. 逻辑回归算法原理及用于解决多分类问题
  18. win2003服务器360修复漏洞打不开网页,360浏览器打不开网页,教您怎样解决360浏览器打不开网页...
  19. CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
  20. java兔子繁殖总数_Java 兔子繁殖迭代问题

热门文章

  1. Ruby 之 Block, Proc, Lambda 联系--区别,转载
  2. WCF配置文件全攻略
  3. 【Leetcode】刷题之路2(python)
  4. wamp的mysql单独使用_Windows 7+8.1+10 单独安装配置 PHP+Apache+MySQL(不使用 WAMP)
  5. 垃圾清理代码_最近弄了个清理电脑C盘的经验
  6. rpm方式安装mysql5.7.24_linux centOS 7安装mysql 5.7.24
  7. android studio dump java heap_Android Studio 3.0 Memory Profiler使用
  8. 批量 材质 调整_SMT打样小批量加工中的助焊剂是什么
  9. debian php mysql 包_Linux+Varnish+Apache+MySQL+PHP一键包For Ubuntu/Debian
  10. MySQL面试题 | 附答案解析(十二)