什么是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@:@"。那究竟是如何得来该字符串呢?其实我们有两种方式:
- 直接查表。在Type Encodings里面列出了对应关系。
- 使用 @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?相关推荐
- iOS之深入解析如何使用Block实现委托方法
一.前言 Block 和 Delegate 是对象间传递消息的常用机制,这两个机制可以说是各有千秋. Delegate 可以很方便把目标动作的执行过程划分为多个方法,以展现不同时间节点下特定的操作:B ...
- Aspects swift 源代码分析
steipete/Aspects 的设计,挺高深莫测的 一般我们 hook, hook 一个类的所有实例的方法 这里 hook 的粒度,到了对象级别 而且不需要建立,大量的 IMP 利用到了固有的方法 ...
最新文章
- cordova 安装ssl证书_cordova环境配置(android)
- iphone 使用popViewController如何避免内存泄露
- redis延迟消息队列不准时php,Redis实现延迟消息队列
- 安徽计算机应用基础高考试题,安徽省对口高考试题(计算机应用基础部分)
- ubuntu 14.04.03 LTS(64bit) 安装PyCharm
- “呵呵呵”之后 B站又申请了“一键三连”商标
- IDEA下Springcloud框架搭建(一)之服务注册与发现
- c大小写转换函数_字符处理——大小写转换编程思路扩展
- OpenGL基础25:多光源(附简单GLSL配置)
- 14.go build
- java做一个万年历和闹钟,c51实现万年历、温度与闹钟功能程序
- 2021秋招IC验证面经-ARM中国/中科芯/飞腾/地平线/中兴
- 数值计算(四)——插值法(3)Hermite插值法
- SRP记录_20190418
- 国家开放大学计算机网络技术毕业设计,精编国家开放大学毕业论文:购物网站设计...
- 【历史上的今天】10 月 4 日:计算机先驱阿塔纳索夫出生;卡巴斯基创始人诞生;谷歌推出 Google Pixel 手机
- 逻辑回归算法原理及用于解决多分类问题
- win2003服务器360修复漏洞打不开网页,360浏览器打不开网页,教您怎样解决360浏览器打不开网页...
- CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
- java兔子繁殖总数_Java 兔子繁殖迭代问题
热门文章
- Ruby 之 Block, Proc, Lambda 联系--区别,转载
- WCF配置文件全攻略
- 【Leetcode】刷题之路2(python)
- wamp的mysql单独使用_Windows 7+8.1+10 单独安装配置 PHP+Apache+MySQL(不使用 WAMP)
- 垃圾清理代码_最近弄了个清理电脑C盘的经验
- rpm方式安装mysql5.7.24_linux centOS 7安装mysql 5.7.24
- android studio dump java heap_Android Studio 3.0 Memory Profiler使用
- 批量 材质 调整_SMT打样小批量加工中的助焊剂是什么
- debian php mysql 包_Linux+Varnish+Apache+MySQL+PHP一键包For Ubuntu/Debian
- MySQL面试题 | 附答案解析(十二)