我知道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),以便我可以传递它们或通过它们进行枚举?
编辑:我想用现有的方法做到这一点,例如:委托我无法改变的方法。
答案 0 :(得分:4)
使用NSInvocation;它可以封装几乎任意的参数集,一个选择器和一个目标,然后可以直接以简单的方式调用它。
或者,使用块。您可以将调用封装在块内部,捕获您需要的任何状态,同时将其余部分作为参数传递。
您要做的通常是设计/架构问题的指示。你不应该这样做。
然而,肯定存在由于多种原因而需要的情况(合同 - 在那里,完成了,确切地知道合同如何规定对可怕的编码实践的需要)。
但它是否也可以访问当前方法的参数?
"排序。"
不清楚你在问什么。如果"当前的方法"不是你实现的那个,那么你可以做的很少(没有那些真正永远不会被使用的混合或其他运行时游戏)。
如果它是你实现的那个,那么只需使用参数即可。如果要延迟执行(或块),可以在NSInvocation中对它们进行编码。
NSInvocation用于获取特定情况下的参数;特别是在实现方法转发时。但这似乎与你要做的事情无关。
答案 1 :(得分:1)
参数传递的机制取决于体系结构,可能涉及在寄存器,堆栈或两者中传递值。除了调试目的之外,试图动态地查找参数列表可能不是一个好主意,当然也不是可移植的。
以下是一篇文章,我认为这是一个很好的起点,可以更深入地了解参数的传递方式:http://en.wikipedia.org/wiki/Calling_convention
答案 2 :(得分:0)
尝试创建一个接受那些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.
}
}