runtime - 方法动态添加

来源:互联网 发布:网络搭建 编辑:程序博客网 时间:2024/04/29 11:00

示例:

void actionTest_IMP(id self, SEL _cmd){    NSLog(@"DemoTest");}- (void)addMethod{    class_addMethod([DemoClass class], @selector(actionTest), (IMP)actionTest_IMP, "v@:");    // Test    DemoClass *instance = [[DemoClass alloc] init];    [instance actionTest];    [instance release];}

注意点:使用此actionTest这个方法需要做的处理是在DemoClass这个类的.h文件中要声明方法,不然编译过不了。

我们首先定义了一个DemoClass,继承NSObject,没有任何自带方法,接着定义了一个函数。这里提一句,Objective-C的方法(method)就是一个至少需要两个参数(self,_cmd)C函数: void actionTest_IMP(id self, SEL _cmd)。接下来在addMethod方法中,我们调用class_addMethod()DemoClass添加方法,class_addMethod()是这样定义的:

BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

参数说明:

cls:被添加方法的类

name:SEL方法名(Objective-C)

imp:实现这个方法的函数(C)

types:一个定义该函数返回值类型和参数类型的字符串,这个具体会在后面讲

接着创建DemoClass的实例,调用actionTest,运行,输出DemoTest,添加方法成功。

接下来说一下types参数,
比如我们要添加一个这样的方法:-(int)say:(NSString *)str;
相应的实现函数就应该是这样:

int say(id self, SEL _cmd, NSString *str) {     NSLog(@"%@", str);     return 100;//随便返回个值  } 

class_addMethod这句就应该这么写:

 class_addMethod([DemoClass class], @selector(say:), (IMP)say, "i@:@");

其中types参数为”i@:@“,按顺序

i 返回值类型int,若是v则表示void

@ 参数id(self)

: SEL(_cmd)

@ id(str)

都是定义好的(Type Encodings),关于Type Encodings的其他类型定义请参考官方文档

最后调用say:方法:

int a = [instance say:@"something"]; NSLog(@"%d", a);

输出something100

参照前辈经验并进行了一番测试整理。

0 0
原创粉丝点击