美文网首页
方法动态调用

方法动态调用

作者: SpursGo | 来源:发表于2017-05-31 09:38 被阅读2次

只知道类名 动态调用方法

   Class cls = NSClassFromString(@"a");
    
    [cls performSelector:NSSelectorFromString(@"show")];
    
    Method method = class_getInstanceMethod(cls, NSSelectorFromString(@"run"));
    if (method) {
        IMP imp = method_getImplementation(method);
        imp();
    }
- (id)performSelector:(SEL)aSelector onTarget:(id)target withArgs:(NSArray *)args
{
    id ret = nil;
    
    if (aSelector == nil || target == nil || ![target respondsToSelector:aSelector]) {
        return ret;
    }
    
    NSLog(@"【action】%@ %@ %@ %@",NSStringFromSelector(_cmd),NSStringFromClass([target class]),NSStringFromSelector(aSelector),args);
    NSMethodSignature *signature = [target methodSignatureForSelector:aSelector];
    if (args.count + 2 != signature.numberOfArguments) {
        return ret;
    }
    
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    [invocation setSelector:aSelector];
    [invocation setTarget:target];
    for (int i = 2, j = 0; j < args.count; i++, j++) {
        id arg = [args objectAtIndex:j];
        [invocation setArgument:&arg atIndex:i];
    }
    [invocation invoke];
    
    NSUInteger length = [[invocation methodSignature] methodReturnLength];
    //    void *buffer = (void *)malloc(length);
    if (length > 0) {
        [invocation getReturnValue:&ret];
    }
    
    return ret;
}

- (id)performClassSelector:(SEL)aSelector onTarget:(Class)target withArgs:(NSArray *)args
{
    id ret = nil;
    
    NSLog(@"【action】%@ %@ %@ %@",NSStringFromSelector(_cmd),NSStringFromClass([target class]),NSStringFromSelector(aSelector),args);
    if (aSelector == nil || target == nil) {
        return ret;
    }
    
    NSMethodSignature *signature = [target methodSignatureForSelector:aSelector];
    if (args.count + 2 != signature.numberOfArguments) {
        return ret;
    }
    
    NSMutableString *argsInCTypes = [NSMutableString stringWithString:@"v"];
    for (int i = 0; i < args.count; ++i) {
        [argsInCTypes appendString:@"@:"];
    }
    signature = [target methodSignatureForSelector:aSelector]; // [NSMethodSignature signatureWithObjCTypes:argsInCTypes.UTF8String];
    if (signature == nil) {
        return ret;
    }
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    [invocation setSelector:aSelector];
    [invocation setTarget:target];
    for (int i = 2, j = 0; j < args.count; i++, j++) {
        id arg = [args objectAtIndex:j];
        [invocation setArgument:&arg atIndex:i];
    }
    [invocation invoke];
    
    NSUInteger length = [[invocation methodSignature] methodReturnLength];
    //    void *buffer = (void *)malloc(length);
    if (length > 0) {
        [invocation getReturnValue:&ret];
    }
    
    return ret;
}

相关文章

  • 我眼中的元编程-方法篇

    Ruby是一门动态语言,动态创建与调用方法是其中一个体现。 动态方法 动态调用方法(动态派发) 动态调用方法,是指...

  • iOS动态调用类方法

    iOS动态调用类方法(不带参数) iOS动态调用类方法(带参数) iOS动态调用类方法(有返回值) 优点 弱化连接...

  • 动态调用动态库方法 c/c++ linux windows

    动态调用动态库方法c/c++linuxwindows 关于动态调用动态库方法说明 一、 动态库概述 1、 动态库的...

  • Struts2动态方法调用

    动态方法调用 在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理...

  • 《Ruby 元编程》读书笔记三:方法

    动态方法 目的:消除重复的代码。 ①动态调用方法 调用方法时,通常使用(·),也可以使用Object#se...

  • 静态代理

    facade 动态方法 调用

  • Ruby元编程笔记——2.方法

    动态方法 动态调用方法Object#send动态定义方法Module#define_method method_m...

  • 方法动态调用

    只知道类名 动态调用方法

  • 动态方法调用

    在介绍动态方法调用之前,我们先搞清楚方法调用的本质是什么。了解runtime的朋友都知道,OC语言会在编译期转换成...

  • Runtime学习笔记

    一.消息机制 OC调用方法是动态调用 调用未实现的方法编译不报错 方法调用的本质是发送消息 方法调用的本质是 执行...

网友评论

      本文标题:方法动态调用

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