使用NSString以编程方式访问或创建Objective-C中的方法

时间:2014-05-13 18:08:08

标签: ios objective-c dynamic methods

我正在尝试使用一个字符串数组在我的类中运行时动态访问方法。现在这些方法已经存在,最终我想创建它们。 这可能吗?

例如:

bool nextLevel=NO;
for(NSString * match in gameLevels)
{

    if([match isEqualToString:self.level])
    {
        nextLevel=YES;
    }
    else if(nextLevel==YES)
    {
        self.level=match;
        nextLevel=NO;
    }
}
//access method named self.level

提前谢谢!

2 个答案:

答案 0 :(得分:1)

我用:

NSSelectorFromString(selectorString)

在您的情况下,selectorString将是:

NSString * selectorString = @"setLevel:";

这是' setLevel'而不是'水平'因为在分配发生时,Objective-C运行时会自动将点属性扩展为这些选择器名称。

答案 1 :(得分:0)

要访问基于字符串的方法,请检查其他答案。

要在运行时添加方法,您需要创建IMP函数或块。

如果使用某个功能,可以是:

void myMethodIMP(id self, SEL _cmd)
{
    // implementation ....
}

您也可以使用这样的块:

IMP blockImplementation=imp_implementationWithBlock(^(id _self, ...){
    //Your Code here
}

然后你需要添加方法,如下所示:

class_addMethod(yourClass, @selector(selectorName), (IMP) blockImplementation, encoding);

编码部分是一种特殊的运行时编码,用于描述方法接收的参数类型。您可以在Objective-C运行时引用上找到它。

如果在生成的方法上收到动态参数,则需要使用va_list读取值。