什么是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

相关文章
|
前端开发 程序员 C#
程序人生 - 这几门语言可能要被淘汰了!
程序人生 - 这几门语言可能要被淘汰了!
134 0
程序人生 - 这几门语言可能要被淘汰了!
|
Swift
数组
数组
132 0
数组
|
自然语言处理 Swift iOS开发
iOS混淆工具
简介: 争取做一款最好的代码混淆工具,模拟人工手动混淆,识别上下文 ,支持继承链、类型识别、方法多参等复杂高级混淆。
2639 0
iOS混淆工具
|
iOS开发 C++
iOS 类的加载分析 (中)
我们都知道iOS的整体机制是懒加载, 也是就是使用到, 再去加载, 不使用就释放掉来节省内存.
83 0
|
JavaScript 前端开发 Swift
JavaScript基础之一——语句与数据类型
JavaScript基础之一——语句与数据类型
148 0
|
缓存 前端开发 JavaScript
CDN缓存相关问题及命中率优化
本文详细介绍旅CDN缓存命中率的概念,分析了无法命中缓存的问题原因以及命中率降低影响因素,并针对命中率降低及如何优化做了分析和介绍。
2585 0
CDN缓存相关问题及命中率优化
|
移动开发 前端开发 JavaScript
编程语言排行榜 - 2020年度最热门编程语言盘点!
工欲善其事,必先利其器。业务需求的满足,离不开移动应用框架、工具和编程语言。为了简化和加快整个开发进程,下面让我们一起来探究一下,那些对于移动应用开发人员和业务服务来说,至关重要且需要谨慎选择的最佳编程语言。
编程语言排行榜 - 2020年度最热门编程语言盘点!
|
移动开发 前端开发 JavaScript
编程语言排行榜 - 2020年度最热门编程语言盘点!
工欲善其事,必先利其器。业务需求的满足,离不开移动应用框架、工具和编程语言。为了简化和加快整个开发进程,下面让我们一起来探究一下,那些对于移动应用开发人员和业务服务来说,至关重要且需要谨慎选择的最佳编程语言。
571 0
编程语言排行榜 - 2020年度最热门编程语言盘点!
|
自然语言处理 大数据 API
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
/ // Copyright (c) 2015年 韩俊强. All rights reserved. // import Foundation // Swift当中的输出函数 // println Swift2.
1154 0