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);
输出something
和100
。
参照前辈经验并进行了一番测试整理。
- Runtime-动态添加方法
- runtime - 方法动态添加
- runtime - 动态添加方法
- 【Runtime】动态添加方法demo
- ios runtime 动态向类添加方法
- runtime给现有类动态添加方法
- Runtime(动态添加方法)笔记
- runtime实战(二)动态添加方法
- Runtime的使用7 【动态添加方法】
- runtime之动态添加方法(动态决议,请求转发)
- runtime 动态添加方法实现方法懒加载
- runtime动态添加属性
- Runtime 动态添加属性
- runtime -- 动态添加属性
- Runtime-动态创建类添加属性和方法
- Runtime-动态创建类添加属性和方法
- runtime为什么可以动态添加变量和方法?
- Runtime(二)动态添加方法以及消息转发机制
- DeepLearning: 数据预处理2:图片resize(matlab代码)
- [疯狂Java]JDBC:连接池
- 对象传递
- Laravel 上传excel,读取并写入数据库 (实现自动建表、存记录值
- 进程 vs. 线程
- runtime - 方法动态添加
- Contextual Tab开发相关
- Android之"AES"加密解密
- 把excel转换成pdf表格的两种方法
- 权限管理程序
- redis快速入门-数据类型
- 老瓶装新酒,结合jquery来实现asp.net repeater的主从表样式(类似masterdetail控件)
- api
- iOS中对字符串进行md5加密算法