美文网首页
Runtime动态添加方法的三种方式

Runtime动态添加方法的三种方式

作者: 邓布利多教授 | 来源:发表于2019-07-10 17:04 被阅读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)];

相关文章

网友评论

      本文标题:Runtime动态添加方法的三种方式

      本文链接:https://www.haomeiwen.com/subject/vzahkctx.html