Objective C中如何实现动态方法调用?

我想了解一下,在Objective C中如何实现动态方法调用。我的理解是,动态方法调用是在程序运行时使用字符串来确定要调用的方法,这可以实现非常灵活的代码结构。我已经尝试使用performSelector系列方法来实现,但是似乎有一些限制,因为我必须提前知道要调用的方法名称,并且方法参数必须是对象类型,不能是基本数据类型。希望有经验的老师能够指导一下,如何在Objective C中更灵活地实现动态方法调用。谢谢!

提问时间:2023-07-06 07:38:17 编辑时间:2023-07-06 07:38:19 提问者: 空城旧梦
  • 竹林之谣
    8

    在Objective C中实现动态方法调用有多种方式,其中一种比较常用的是通过Runtime库中的函数来实现。例如,可以使用以下函数来实现根据方法名字符串执行对应的方法:

    // 获取方法签名
    NSMethodSignature *methodSignature = [self methodSignatureForSelector:NSSelectorFromString(methodName)];
    
    if (methodSignature) {
        // 创建NSInvocation对象
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
        // 设置目标对象
        [invocation setTarget:self];
        // 设置方法选择器
        [invocation setSelector:NSSelectorFromString(methodName)];
        // 设置参数
        [invocation setArgument:&param1 atIndex:2];
        [invocation setArgument:&param2 atIndex:3];
        // 执行方法调用
        [invocation invoke];
    }
    

    这样就可以实现动态方法调用,并且可以支持传递基本数据类型参数。需要注意的是,由于这种方式是动态创建方法签名和NSInvocation对象,所以比较消耗性能,应尽量减少使用。

    回答时间:2023-07-06 07:38:22