iOS_Runtime3_动态添加方法
2017-08-22 11:14
323 查看
当调用一个未实现的对象方法,或者说发送未知的消息给接收者时候,消息的接受者会调用
当调用一个未实现的类方法,或者说发送未知的消息给接收者时候,消息的接受者会调用
任何一个方法默认都有两个隐式参数(
为类添加方法的方法:
动态添加方法代码示例如下:
使用场景:
- 如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。
- 使用
iOS_Runtime1_消息发送机制
iOS_Runtime2_方法交换
iOS_Runtime4_动态添加属性
iOS_Runtime5_消息转发
iOS_Runtime6_字典转化为模型应用
代码地址:
https://github.com/FlyingKuiKui/RunTime.git
+ (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
相关文章推荐
- iOS 面试题(十):runtime 使用——(动态添加方法/动态交换方法/动态添加属性)
- ios的runtime为什么可以动态添加方法
- ios开发runtime学习三:动态添加方法(实际应用少,面试)
- iOS:runtime的使用(动态添加方法、关联方法、交换方法、遍历私有属性)
- iOS_Runtime修改变量值,交换方法实现,动态添加类,成员变量和方法
- ios runtime 动态向类添加方法
- iOS开发------runtime之动态添加方法(动态决议,请求转发)
- iOS runtime ~ 动态添加方法
- iOS (Category)runtime动态添加属性
- runtime - 方法动态添加
- Runtime 方法替换 和 动态添加实例方法 结合使用
- runtime实战(二)动态添加方法
- 利用runtime实现动态添加方法
- iOS runtime ~ 动态添加属性
- iOS中动态添加属性的方法——关联(e.g. 向Category添加成员变量)
- iOS_Runtime4_动态添加属性
- iOS分类中通过runtime添加动态属性
- runtime实战(二)动态添加方法
- iOS 开发 深入浅出Runtime运行时之官方翻译--动态方法处理
- ios动态添加属性的几种方法