如何制作动态命名的方法参数?

时间:2012-10-20 19:44:19

标签: objective-c methods parameters

  

可能重复:
  Objective C Equivalent of PHP’s “Variable Variables”

我在目标C中创建了一个方法,如下所示:

- (void) startBuildingXArray: (NSMutableArray *) arrayName:(int) senderID;

但是,这是棘手的部分。特定的arrayName参数取决于senderID是什么。具体来说,每个arrayName在其末尾都有一个数字(即array1,array2等),它与此方法中的senderID匹配。有没有办法动态地将一个整数添加到数组名称的末尾作为参数?或者是一种完全不同且更好的方法来产生相同的结果?

换句话说,我想要创造的是这种情况:

- (void) startBuildingXArray: (NSMutableArray *) arrayName+(senderID):(int) senderID;

当然,这不是任何有效的代码,我只是想证明我想要发生的事情。任何人都可以提出任何解决方案吗?

1 个答案:

答案 0 :(得分:1)

您很幸运:Objective-C是一种动态语言,因此您可以在运行时创建选择器(方法名称),并为它们添加相应的实现功能。假设您已经实现了这些方法(例如,从startBuildingXArray:arrayName1:...arrayName9:等),并且您正在寻找一种根据整数ID调用它们的方法:

- (void)callMethodWithParam:(NSMutableArray *)parm ID:(int)ident
{
    // get the selector name and the selector
    char zelektor[128];
    snprintf(zelektor, sizeof(zelektor), "startBuildingXArray:arrayName%d:", ident);
    SEL realSel = sel_getUid(zelektor);

    // Alternatively you can use Foundation as well:
    /*
    NSString *zelektor = [NSString stringWithFormat:@"startBuildingXArray:arrayName%d:", ident];
    SEL realSel = NSSelectorFromString(zelektor);
     */

    // Grab a function pointer to the implementation corresponding to the selector
    IMP imp = class_getInstanceMethod([self class], realSel);

    // and call the function pointer just obtained
    imp(self, realSel, parm, ident);
}

如果您想批量创建具有此类名称的方法,您可以使用类似的方法,但请改用class_addMethod() Objective-C runtime function

然而,这是一个黑客。我建议你使用一个函数并根据传入的整数标识符来实现它的任务。