iOS_Runtime3_动态添加方法
来源:互联网 发布:2016淘宝女装排行榜 编辑:程序博客网 时间:2024/06/11 13:21
- 当调用一个未实现的对象方法,或者说发送未知的消息给接收者时候,消息的接受者会调用
+ (BOOL)resolveInstanceMethod:(SEL)sel;
- 当调用一个未实现的类方法,或者说发送未知的消息给接收者时候,消息的接受者会调用
+ (BOOL)resolveClassMethod:(SEL)sel;
- 任何一个方法默认都有两个隐式参数(
id self, SEL _cmd
),其中self指代调用此方法的对象,_cmd指代方法的编号,经过NSStringFromSelector(_cmd)
处理打印结果为方法名。 - 为类添加方法的方法:
BOOL class_addMethod(Class cls, SEL name, IMP imp,const char *types)
。其中参数一:为哪个类添加方法;参数二:添加什么方法;参数三:方法实现 => 函数 => 函数入口 => 函数名;参数四:方法类型:void用v来表示,id参数用@来表示,SEL用:来表示。
动态添加方法代码示例如下:
// UIImage+Image.h// 未实现的对象方法- (void)clearImage;// UIImage+Image.m#pragma mark - 动态添加方法// 对象方法未实现,会调用此类方法+ (BOOL)resolveInstanceMethod:(SEL)sel{// [NSStringFromSelector(sel) isEqualToString:@"clearImage"]; // 判断方式1 // 判断方式2 if (NSSelectorFromString(@"clearImage") == sel) { // 为类添加方法 class_addMethod(self, sel, (IMP)clearImage, "v@:@"); return YES; } return [super resolveInstanceMethod:sel];}// 此方法即(IMP)clearImage// 任何一个方法默认都有两个隐式参数(`id self, SEL _cmd`),其中self指代调用此方法的对象,_cmd指代方法的编号,经过`NSStringFromSelector(_cmd)`处理打印结果为方法名。void clearImage(id self, SEL _cmd, NSNumber *number){ NSLog(@"clearImage for %@--%@--%@", self,NSStringFromSelector(_cmd),number);}// 如果是类方法未实现,则会调用下述方法:/*+ (BOOL)resolveClassMethod:(SEL)sel{}*/// 调用示例:UIImage *image = [[UIImage alloc]init];[image clearImage];// 输出: clearImage for <UIImage: 0x608000282760>, {0, 0}--clearImage--<UIImage: 0x608000282760>, {0, 0}[image performSelector:@selector(clearImage) withObject:@"kkkk"];// 输出:clearImage for <UIImage: 0x608000282760>, {0, 0}--clearImage--kkkk// 方法`performSelector:withObject:`表示去执行某个方法aSelector,传递参数object
使用场景:
- 如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。
- 使用performSelector:withObject
调用方法,主要是为了调用动态添加的方法。
iOS_Runtime1_消息发送机制
iOS_Runtime2_方法交换
iOS_Runtime4_动态添加属性
iOS_Runtime5_消息转发
iOS_Runtime6_字典转化为模型应用
代码地址:
https://github.com/FlyingKuiKui/RunTime.git
阅读全文
0 0
- iOS_Runtime3_动态添加方法
- 动态添加方法,添加协议
- Runtime-动态添加方法
- runtime - 方法动态添加
- runtime - 动态添加方法
- IOS 动态添加方法
- 动态添加SiteMapPath的方法
- Html元素动态添加方法
- 【Runtime】动态添加方法demo
- js动态添加事件的方法
- js动态添加事件的方法!()
- js动态添加事件的方法
- js动态添加事件的方法
- VC 控件动态添加的方法
- JS动态添加事件的执行方法.
- 技巧 Html元素的动态添加方法
- js动态添加事件的方法
- asp.net 动态添加JavaScript方法
- MATLAB Starting Error in Ubuntu 12.04: libc.so.6: not found
- 浏览器关闭后,Session就销毁了吗?
- Java引用详解(强引用、软引用、弱引用、虚引用)
- JS中setTimeout()的用法详解
- 第一次写博客
- iOS_Runtime3_动态添加方法
- radio,checkbox的重复点击实现
- Git 使用基础和示例
- 3398-数据结构实验之排序一:一趟快排
- Hibernate-增删改查
- java、python--差分隐私拉普拉斯分布(Laplace)实现
- listview滑动到指定坐标位置
- gdfzoj #786 很容易AC的题(AC自动机)
- Educational Codeforces Round 27- D Driving Test