什么是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月前
|
Android开发 iOS开发
阿里云 Qoder 夜间折扣上线,每晚 22:00 到次日 08:00,放开用!
阿里云Qoder推出“Night Qoder”夜间折扣:每晚22:00–次日08:00自动享优惠,Qwen3.7-Max低至2折(省80%),Plus版4折(省60%)。全系产品覆盖,无需报名,模型能力不变,仅计费更优。今夜就启程!
721 0
|
3月前
|
存储 弹性计算 人工智能
阿里云服务器哪个更划算?ECS 99元、轻量38元及免费中心云服务器申请指南
阿里云新手省钱指南:99元/年ECS(2核2G,续费同价)、38元/年轻量服务器(200M带宽)、学生领300元代金券免费用、199元企业版及免费试用中心等多途径降本,覆盖个人、学生与企业用户。阿里云官方活动:https://t.aliyun.com/U/OTnSAH
573 0
|
4月前
|
人工智能 自然语言处理 前端开发
Hermes Agent与Claude Code协同开发完整指南:架构、阿里云部署与实战案例
在AI驱动软件开发的成熟阶段,单一代码工具很难覆盖需求拆解、流程管控、经验沉淀、代码实现、测试调试全链路工作。Hermes Agent作为具备长记忆、自主任务调度、自我进化能力的智能主控,搭配Claude Code专业代码生成、重构、调试工具,能够形成类似企业“技术主管+资深开发工程师”的硅基协同团队,完整覆盖从自然语言需求到可运行代码的端到端开发闭环。依托阿里云Dev云开发机、轻量应用服务器两种部署载体,普通开发者与企业团队均可零复杂配置快速搭建这套AI研发体系,同时兼容阿里云百炼全系列大模型服务,下文从架构分工、部署渠道、完整配置、标准工作流、实战案例、配套资源几个维度完整讲解。
581 0
|
10月前
|
机器学习/深度学习 人工智能 PyTorch
深度解析 Google JAX 全栈:带你上手开发,从零构建神经网络
Google凭借JAX AI栈实现AI全栈垂直整合,覆盖模型、应用、云与硬件。JAX结合XLA编译器,Flax构建网络,Optax优化训练,Orbax管理 checkpoint,已在Google及Anthropic、Apple等广泛应用,助力高效大规模AI训练。
1200 6
|
10月前
|
传感器 人工智能 安全
【口碑排行】 甲方真实的投票:售后服务场景下,客户满意度最高的语音机器人品牌盘点
在2025大模型落地元年,语音机器人成为售后数字化转型关键。本文基于IDC、信通院等权威数据,从交互自然度、业务闭环、工程化交付三大维度,盘点主流服务品牌,助力企业选型实现降本增效与95%以上客户满意度双目标。
|
机器学习/深度学习 编解码 算法框架/工具
经典神经网络论文超详细解读(二)——VGGNet学习笔记(翻译+精读)
经典神经网络论文超详细解读(二)——VGGNet学习笔记(翻译+精读)
1158 1
经典神经网络论文超详细解读(二)——VGGNet学习笔记(翻译+精读)
|
传感器 人工智能 定位技术
智能手表续航太短?聊聊可穿戴设备的能耗管理黑科技
智能手表续航太短?聊聊可穿戴设备的能耗管理黑科技
1035 11
|
人工智能 网络协议 IDE
使用通义灵码AI高效学习muduo网络库开发指南
Muduo 是一个基于 C++11 的高性能网络库,支持多线程和事件驱动,适用于构建高效的服务器和应用程序。它提供 TCP/IP 协议支持、异步非阻塞 I/O、定时器、异步日志等功能,并具备跨平台特性。通过 Git 克隆 muduo 仓库并切换至 C++17 分支可开始使用。借助 AI 工具如 Deepseak-v3,用户可以更便捷地学习和理解 Muduo 的核心模块及编写测试用例,提升开发效率。
|
测试技术 网络安全
支付宝接口代签约失败排查指南
【11月更文挑战第5天】支付宝接口代签约失败排查指南:检查参数信息(必填参数、格式、业务合理性)、确认签约状态和权限(商户状态、应用权限、用户授权)、验证网络和系统环境(网络连接、系统兼容性、服务器配置)、检查异步通知设置(通知地址、处理逻辑)、查看官方文档和错误码、联系支付宝客服。
1201 14

热门文章

最新文章