Runtime动态添加方法的三种方式
2019-07-10 本文已影响0人
邓布利多教授
1、创建一个类
.h文件
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Dog : NSObject
@end
NS_ASSUME_NONNULL_END
.m文件
#import "Dog.h"
#import <objc/runtime.h>
@implementation Dog
-(void)jump{
NSLog(@"this is a jump action");
}
#pragma mark - 动态添加方法1
+(BOOL)resolveInstanceMethod:(SEL)sel{
if (sel == @selector(jump)) {
IMP imp = class_getMethodImplementation(self, @selector(jump));
class_addMethod(self, sel, imp, "v@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
#pragma mark - 动态添加方法2
+(BOOL)resolveInstanceMethod:(SEL)sel{
return [super resolveInstanceMethod:sel];
}
-(id)forwardingTargetForSelector:(SEL)aSelector{
if (aSelector == @selector(jump)) {
return [Dog new];
}
return [super forwardingTargetForSelector:aSelector];
}
#pragma mark - 动态添加方法3
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
if (aSelector == @selector(jump)) {
return [NSMethodSignature signatureWithObjCTypes:"v@:"];
}
return [super methodSignatureForSelector:aSelector];
}
-(void)forwardInvocation:(NSInvocation *)anInvocation{
SEL sel = [anInvocation selector];
Dog *dog = [Dog new];
if ([dog respondsToSelector:sel]) {
[anInvocation invokeWithTarget:dog];
}else{
[super forwardInvocation:anInvocation];
}
}
@end
2、调用类
引入头文件
#import "Dog.h"
调用
Dog *d = [[Dog alloc]init];
[d performSelector:@selector(jump)];