通过名称调用 Objective-C 方法

问题描述 投票:0回答:2

当我拥有的只是字符串形式的签名时,如何在运行时调用 Objective-C 类上的方法:

NSString* typeName = @"Widgets";
NSString* methodName = [NSString stringWithFormat:@"add%@Object:", typeName];

请注意,方法名称可以在运行时更改,但参数数量保持固定 - 在本例中为一个。

iphone objective-c reflection runtime
2个回答
27
投票

您可以使用类似以下内容:

SEL selector = NSSelectorFromString(methodName);
[myObject performSelector:selector];

如果需要传递参数,还有

performSelector:withObject:
performSelector:withObject:withObject:
方法。


2
投票

为了在 Objective C 上进行反射执行方法调用,只需使用这个快速方法。 objC 使我们能够在运行时检查对象是否支持特定接口,如果存在,则此调用动态发生。

Class classAPI = NSClassFromString(@"yourClassName");
SEL methodToPerformSelector = NSSelectorFromString(@"yourMethodName:");
NSMethodSignature *methodSignature = [classAPI methodSignatureForSelector:methodToPerformSelector];
NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[myInvocation setTarget:classAPI];
[myInvocation setSelector:methodToPerformSelector];

/* if you have an argument */
[myInvocation setArgument:&someArgumentToAddToYourMethod atIndex:argumentIndexInMethod];
[myInvocation retainArguments];

[myInvocation invoke];
© www.soinside.com 2019 - 2024. All rights reserved.