class_addMethod 简介
BOOL class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, const char * _Nullable types)
在runtime.h中定义, 其作用是给一个类添加新的方法及该方法的具体实现.
其 返回值为 BOOL 类型, yes表示添加方法成功, no表示添加方法失败.
参数介绍
/** * Adds a new method to a class with a given name and implementation.* * @param cls 将要添加方法的类, 可以传 [类名 class] * @param name 将要添加的方法名, 传的类型为 @selector(方法名).* @param imp 实现这个方法的函数, 传的类型 (1) C语言写法: (IMP) 方法名; (2) OC写法: class_getMethodImplementation(self, @selector(方法名))* @param types 添加方法的返回值和参数数组 */
举例:
(1) C语言举例
void exchange_function(id self, SEL _cmd, NSString *str){NSLog(@"exchange_function");
}@implementation myClass : NSObject- (void)exchangeMethodWithSel:(SEL)sel{class_addMethod([self class], sel, (IMP)exchange_function, "v@:@");
}@end
(2) OC方法举例
@implementation myClass : NSObject- (void)exchange_functionTwo:(NSString *)str{NSLog(@"exchange_functionTwo");
}- (void)exchangeMethodWithSel:(SEL)sel{// "v@:@":v表示是添加方法无返回值, @表示是id(也就是要添加的类); :表示添加的方法类型 @表示:参数类型class_addMethod([self class], sel, class_getMethodImplementation([self class], @selector(exchange_functionTwo:)), "v@:@");
}@end
注释:
const char *type 含义
Code | Meaning |
c | A char |
i | An int |
s | A short |
l | A long |
q | A long long |
C | An unsigned char |
I(大写i) | An unsigned int |
S | An unsigned short |
L | An unsigned Long |
Q | An unsigned long long |
f | A float |
d | A double |
B | A C++ bool or C99 _Bool |
v | A void |
* | A character string (char *) |
@ | An object (whether statically typed or typed id) |
# | A class object (Class) |
: | A method selector (SEL) |
[array type] | An array |
{name=type...} | A structure |
(name=type...) | A union |
bnum | A bit field of num bits |
^type | A pointer to type |
? | An unknown type (among other things, this code is used for function pointers) |
class_addMethod 简介相关推荐
- Runtime底层原理--Runtime简介、函数注释
Runtime官方文档介绍直通车 扩展:编译时 看到运行时就会想到编译时,编译时主要是将源代码翻译成可识别的机器语言,如果编译时类型检查等翻译过程中发现语法分析之类有错误会给出相应的提示.比如OC,s ...
- etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理
1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...
- Docker学习(一)-----Docker简介与安装
一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...
- 【Spring】框架简介
[Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...
- TensorRT简介
TensorRT 介绍 引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference) ...
- 谷粒商城学习笔记——第一期:项目简介
一.项目简介 1. 项目背景 市面上有5种常见的电商模式 B2B.B2C.C2B.C2C.O2O B2B 模式(Business to Business),是指商家和商家建立的商业关系.如阿里巴巴 B ...
- 通俗易懂的Go协程的引入及GMP模型简介
本文根据Golang深入理解GPM模型加之自己的理解整理而来 Go协程的引入及GMP模型 一.协程的由来 1. 单进程操作系统 2. 多线程/多进程操作系统 3. 引入协程 二.golang对协程的处 ...
- Linux 交叉编译简介
Linux 交叉编译简介 主机,目标,交叉编译器 主机与目标 编译器是将源代码转换为可执行代码的程序.像所有程序一样,编译器运行在特定类型的计算机上,输出的新程序也运行在特定类型的计算机上. 运行编译 ...
- TVM Operator Inventory (TOPI)简介
TOPI简介 这是 TVM Operator Inventory (TOPI) 的介绍.TOPI 提供了比 TVM 具有更高抽象的 numpy 风格的,通用操作和调度.TOPI 如何在 TVM 中,编 ...
最新文章
- Ubuntu12.04下在Android4.0.4源码下载及其编译过程(转载)
- JEECG v3.0.beta发布,基于代码生成器的智能开发平台
- 案例 解析频道节目单 c# 1614261055
- LeetCode 662. Maximum Width of Binary Tree
- APUE 学习笔记(三) 文件和目录
- MongoDB需要慎用local、admin数据库
- Ubuntu下好的PDF阅读器介绍
- 浪漫桃心的Android表白程序
- EXCEL 多个相似表格合并计算(合并计算工具)
- 前端Demo - 日历控件纯原生实现
- Oracle Exadata 技术详解 - 李亚
- FMS4.5限制连接数
- adb-monkey-log分析
- 苹果macbookpro多少钱_买一套可用的苹果全家桶,要花多少钱?
- 等保培训.04.主机系统安全测评
- android相机拍摄格式NV21,如何通过libyuv将NV21格式的android相机预览数据转换为i420?...
- 边缘设备、系统及计算杂谈(2)——go语言
- 一个简单的视频播放器
- 2017电脑性能测试软件,哪个比较权威呢 电脑跑分软件排行榜2017年
- 京瓷6525_京瓷6525复印机报价 京瓷6525复印机产品配置介绍
热门文章
- 电梯演讲展示产品优势特点
- 光模块中的DDM介绍
- ActiveMQ双机热备时的连接跳动问题解决
- [OpenGL]OpenGL几何变换的秘密--投影(透视投影、平行投影、正投影)
- 学计算机的考cpa,cpa考试计算器该如何选择?
- 1078: 平均年龄
- python爬取微博数据存入数据库_Python爬取微博数据并存入mysql,excel中
- UG/NX10二次开发学习视频目录整理(NXOPEN进阶篇)
- C/C++语言问题——某年某月的天数是多少?
- android老化软件,Old Face Changer Camera变老换脸相机