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) |
本文详细介绍了如何使用Objective-C运行时API中的class_addMethod函数来为类动态添加方法及其具体实现。文中提供了两种不同的实现示例,一种是使用C语言风格的函数,另一种则是使用Objective-C的方法实现。
6610

被折叠的 条评论
为什么被折叠?



