码迷,mamicode.com
首页 > 其他好文 > 详细

runtime 方法替换 和 动态添加类方法 结合使用

时间:2016-01-12 06:29:27      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

原文地址:runtime 方法替换 和 动态添加类方法 结合使用

前言:方法替换,可以替换任意外部类的方法,而动态添加方法只能实现在被添加类创建的对象里,但是将方法替换和动态添加方法结合使用,可以实现,对任意外部类动态添加需要的方法。

缺陷:1、含参数的方法难以处理,参数值需要根据实际业务逻辑而定。2、无法实现动态添加实例方法。

Create Person.h and Person.m

Person.h:

1
2
3
4
5
#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

Person.m:

1
2
3
4
5
#import "Person.h"

@implementation Person

@end

Create OtherPerson.h and OtherPerson.m

OtherPerson.h:

1
2
3
4
5
#import <Foundation/Foundation.h>

@interface OtherPerson : NSObject

@end

OtherPerson.m:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#import "OtherPerson.h"
#import <objc/message.h>

@implementation OtherPerson


+(void)load{
Class clazz = NSClassFromString(@"Person");

//获取替换前的类方法,也就是目标类方法
Method eat = class_getClassMethod(clazz, @selector(resolveInstanceMethod:));
//获取替换后的类方法,也就是自定义类方法
Method notEat = class_getClassMethod(self, @selector(hy_resolveInstanceMethod:));

//然后交换类方法
method_exchangeImplementations(eat, notEat);

}

void eat(id self,SEL sel)
{
NSLog(@"到底吃不吃饭了");
NSLog(@"%@ %@",self,NSStringFromSelector(sel));
}
//自定义方法,内部实现的是目标类的resolveInstanceMethod:(SEL)sel方法
+(BOOL)hy_resolveInstanceMethod:(SEL)sel{
//当sel为实现方法中 有 eat 方法
if (sel == NSSelectorFromString(@"eat")) {
//就 动态添加eat方法

// 第一个参数:给哪个类添加方法
// 第二个参数:添加方法的方法编号
// 第三个参数:添加方法的函数实现(函数地址)
// 第四个参数:函数的类型,(返回值+参数类型) v:void @:对象->self :表示SEL->_cmd
class_addMethod(self, sel, (IMP)eat, "v@:");
}
return YES;
}

@end

last In file ‘main.m’:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#import <Foundation/Foundation.h>

//取消undeclared警告取消
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"

int main(int argc, const char * argv[]) {
@autoreleasepool {

Class clazz = NSClassFromString(@"Person");//拿到了Person这个类
id person = [[clazz alloc] init];//拿到这个类创建的Person对象

[person performSelector:@selector(eat) withObject:nil];

}
return 0;
}

#pragma clang diagnostic pop

download

download github code source

Note

Before use import <objc/message.h> ,need following:

技术分享

 

runtime 方法替换 和 动态添加类方法 结合使用

标签:

原文地址:http://www.cnblogs.com/goodboy-heyang/p/5123092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!