[iOS]在运行时为类添加方法
来源:互联网 发布:虚拟机网络设置 编辑:程序博客网 时间:2024/06/03 21:41
http://longtimenoc.com/archives/ios%E5%9C%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E4%B8%BA%E7%B1%BB%E6%B7%BB%E5%8A%A0%E6%96%B9%E6%B3%95Obj-C用起来真是各种happy,比如现在有这样一种情况:有一个类,我们希望它能响应一个消息(message),但是这个类没有相应的方法(method),而你又偏偏不能重写/继承这个类。这时我们可能会想到,能不能动态地给类添加一个方法呢?感谢Obj-C,仅需简单几步就能实现。先看一段代码#if TARGET_IPHONE_SIMULATOR#import <objc/objc-runtime.h>#else#import <objc/runtime.h>#import <objc/message.h>#endif @interface EmptyClass:NSObject @end @implementation EmptyClass @end void sayHello(id self, SEL _cmd) { NSLog(@"Hello");} - (void)addMethod { class_addMethod([EmptyClass class], @selector(sayHello2), (IMP)sayHello, "v@:"); // Test Method EmptyClass *instance = [[EmptyClass alloc] init]; [instance sayHello2]; [instance release]; }我们首先定义了一个EmptyClass,继承NSObject,没有任何自带方法,接着定义了一个函数。这里提一句,Obj-C的方法(method)就是一个至少需要两个参数(self,_cmd)的C函数,这个函数仅仅输出一句Hello。接下来在addMethod方法中,我们调用class_addMethod()为EmptyClass添加方法,class_addMethod()是这样定义的:BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)参数说明:cls:被添加方法的类name:可以理解为方法名,这个貌似随便起名,比如我们这里叫sayHello2imp:实现这个方法的函数types:一个定义该函数返回值类型和参数类型的字符串,这个具体会在后面讲接着创建EmptyClass的实例,调用sayHello2,运行,输出Hello,添加方法成功。接下来说一下types参数,比如我们要添加一个这样的方法:-(int)say:(NSString *)str; 相应的实现函数就应该是这样:int say(id self, SEL _cmd, NSString *str) { NSLog(@"%@", str); return 100;//随便返回个值}class_addMethod这句就应该这么写:class_addMethod([EmptyClass 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。关于本文所涉及内容的详细信息请参考Objective-C Runtime Reference本文参考了:Add Methods at Runtime in Objective-C(原文的class_addMethods已经废弃了)The Coolest iOS Hack推荐去看看—以上—
0 0
- [iOS]在运行时为类添加方法
- [iOS]在运行时为类添加方法
- iOS 运行时添加属性和方法
- iOS 运行时添加属性和方法
- iOS 运行时添加属性和方法
- iOS 运行时添加属性和方法
- ogre:在运行时,为entity添加骨骼文件,以及合并骨骼文件的方法
- android学习(一) 在运行时为 Activity 添加Fragment
- iOS 运行时runtime应用之二--在category中使用运行时API给类添加属性
- 为Office文档添加Windows窗体控件:在运行时向文档级项目中添加控件
- 为Office文档添加Windows窗体控件:在运行时向应用程序级外接程序中添加控件
- iOS在分类中添加属性,运行时编程,objc runtime 动态增加属性
- 为 iOS 应用组件添加圆角的方法
- iOS为类别添加属性的方法(RunTime)
- iOS开发~为UICollectionView的reloadData方法添加动画
- iOS开发~为UITableView的reloadData方法添加动画
- iOS 为UIView添加渐变色的两种方法
- 如何在运行时添加classpath
- 使用noatime提升文件系统性能
- ColorProgress
- 关于play framework的环境搭建
- iOS开发 cocopods详细使用
- cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND
- [iOS]在运行时为类添加方法
- 单例模式在多线程中的安全性研究
- Asp.net下载文件几种方式
- 解决Clock skew detected.
- 史上最全WebView使用,附送Html5Activity一份
- 解决mac osx下pip安装ipython权限的问题
- poj 2229&wustoj 1269划分数(简单dp)
- Spring AOP 详解
- iOS导入三方框架出现"Unknown type name 'NSString'"错误