通过索引获取objective-c方法的参数

我知道objective-c方法实际上是c函数,前两个参数是self和_cmd。 我正在尝试将剩余的参数作为数组(包括或排除,self和_cmd)

例如:

-(void)someMethod:(id)firstArg withObject:(id)secondArg andObject:(id)thirdArg { //then something like: args[0] //corresponds to self args[1] //corresponds to _cmd args[2] //corresponds to firstArg args[3] //corresponds to secondArg args[3] //corresponds to thirdArg //or just start from firstArg being the 0th item in the index (skipping out self and _cmd) } 

我想要做的是:

 [self doOtherMethod:@selector(otherMethod:withObject:andObject:) withObjects:args]; 

那么我如何获得传递给方法的参数的数组(c数组甚至NSArray),以便我可以传递它们或通过它们枚举?

编辑:我想用现有的方法做到这一点,例如我无法改变的委托方法。

参数传递的机制取决于体系结构,可能涉及在寄存器,堆栈或两者中传递值。 除了调试目的之外,试图动态地查找参数列表可能不是一个好主意,当然也不是可移植的。

这篇文章我认为是一个很好的起点,可以更深入地了解参数的传递方式: http : //en.wikipedia.org/wiki/Calling_convention

使用NSInvocation; 它可以封装几乎任意的参数集,一个选择器和一个目标,然后可以直接以简单的方式调用它们。

或者,使用块。 您可以将调用封装在块内部,捕获您需要的任何状态,同时将其余部分作为参数传递。

您要做的通常是设计/架构问题的指示。 你不应该这样做。

然而,肯定存在由于多种原因而需要的情况(合同 – 在那里,完成了,确切地知道合同如何规定对可怕的编码实践的需要)。


但它还可以访问当前方法的参数吗?

“有点。”

目前尚不清楚你在问什么。 如果“当前方法”不是你实现的那个,那么你可以做的很少(没有那些真正永远不会被使用的混合或其他运行时游戏)。

如果它是你实现的那个,那就只使用参数。 如果要延迟执行(或块),可以在NSInvocation中对它们进行编码。

NSInvocation用于获取特定情况下的参数; 特别是在实现方法转发时。 但这似乎与你想要做的事情无关。

尝试创建一个接受那些args的NSArray的函数。 您可以在不传递self或_cmd的情况下执行此操作。

 - (void)serverRespondedWithJSONObjects:(NSArray *)objects { NSMutableArray *objects = [NSMutableArray array]; for (NSDictionary *dictonary in objects) { SomeObject *object = [[[SomeObject alloc] init] autorelease]; object.name = [dictionary valueForKey:@"name"]; [objects addObject:object]; } [self doSomethingWithArgs:objects]; } - (void)doSomethingWithArgs:(NSArray *)args { for (SomeClass *someObject in args) { //do something interesting with someObject. } }