目的:用字符串代替方法触发器名



我有一个数组,其中包含一个函数的名称和一个参数,看起来像这样。

(
    [0] => (
        [0] => @"getName"
        [1] => @"This is the name"
    )
)

对于我的方法,它看起来像这样

-(NSString *)getName:(NSString *)name {...}

我知道要触发一个方法,我必须执行[[AppDelegate alloc] getName:string];,但是否有任何方法将getName替换为array[0][0]string替换为array[0][1] ?

因为你需要传入参数并获得返回值,所以使用NSInvocation。更多细节在这里NSInvocation for Dummies?

对于NSInvocation的set Selector,可以将选择器设置为NSSelectorFromString(array[0][0]);参数和返回值也类似。

你在这里做的事情有点危险。无论如何,你可以通过使用选择器来实现这一点。

对象采用一种协议,该协议告诉它们是否可以执行某些操作。所以基本上,你必须首先从数组中获取函数的字符串和参数。

然后使用允许在运行时调用的函数来创建选择器。

SEL aSelector = NSSelectorFromString(@"methodName");

然后,询问你的对象是否可以执行选择器(如果你只是盲目地发送它,可能会发生不好的事情)

- (BOOL)respondsToSelector:(SEL)aSelector

最后你可以用你之前得到的对象(这是参数)执行选择器。

- (id)performSelector:(SEL)aSelector withObject:(id)anObject

查看选择器:https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html

对象协议:https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Protocols/NSObject_Protocol/Reference/NSObject.html//apple_ref/occ intfm/NSObject/respondstoselectorismemberofclass:

编辑:正如danh提到的,选择器名称后面有一个冒号是很重要的,因为你的方法接受一个参数。如果没有传递参数,就不需要它。

以来
- (id)doSomething;

不同
- (id)doSomething:(id)argument;

这是@Chiquis想法的一个工作示例。(注意你的选择器需要一个冒号):

-(void)doSomethingALittleDangerous
    NSArray *array = @[@[@"getName", @"this is the name"]];
    NSString *notQuiteTheSelectorStr = array[0][0];
    NSString *selectorStr = [notQuiteTheSelectorStr stringByAppendingString:@":"];
    SEL selector = NSSelectorFromString(selectorStr);
    // this generates a warning because the compiler cannot confirm that
    // self implements this programmatically derived selector
    if ([self respondsToSelector:selector]) {
        NSString *name = [self performSelector:selector withObject:array];
    }
    NSLog(@"%@", name);
}
- (NSString *)getName:(NSArray *)array {
    return array[0][1];
}

相关内容

最新更新