我想用正确的参数值为NSInvocation
当前方法动态创建。通常,人们可能会这样做:
- (void)messageWithArg:(NSString *)arg arg2:(NSString *)arg2
{
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:_cmd]];
[invocation setTarget:self];
/*
* How do we set the argument values here dynamically?
*/
}
显式设置参数值很简单,我们可以这样做:
[invocation setArgument:&arg atIndex:2];
[invocation setArgument:&arg2 atIndex:3];
我希望能够通过以下方式循环执行此操作:
for(int i = 0; i < [[self methodSignatureForSelector:_cmd] numberOfArguments]; i++) {
[invocation setArgument:?!?! atIndex:i + 2];
}
困难的部分是动态获取给定索引的参数值。
这里问了一个类似的问题,回答者说他不知道引用类复杂性的解决方案。我不同意复杂性 - 在底层代码中,我们已经确切地知道堆栈在设置堆栈框架后应该如何看待,因为编译器知道使用的调用约定。例如,在 x86 上,stdcall
我们可以轻松访问参数值,因为我们知道它们是固定偏移量ebp
:
- 旧
ebp
于0(%ebp) - 返回地址为4(%ebp)
- 第一个参数在8(%ebp)
- 等等
我怎样才能实现我想要的,或者语言中真的不存在任何机制来支持基于索引的参数值获取?在这一点上,我可以接受这是真的,因为 C 标准中不存在这样的特性。但是,我想得到确认和/或解释这背后的原因。