方法动态调用

只知道类名 动态调用方法

   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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • NSInvocation:配置方法调用,主要可以重新包装方法调用。解决开发中偶尔有需求使用performSelec...
    大兵哥_bigboy阅读 5,158评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,281评论 18 399
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,865评论 0 9
  • 动态调用动态库方法c/c++linuxwindows 关于动态调用动态库方法说明 一、 动态库概述 1、 动态库的...
    KINGZ1993阅读 14,743评论 0 10
  • 1) 美琳搬家了,养了一条狗。约她出来相聚,她说就去她那儿吧,要不狗狗会一直等着她,没人理。听她说得可怜兮兮,我也...
    粉妖阅读 1,616评论 0 0

友情链接更多精彩内容