以编程方式访问Objective-C中的方法参数

以编程方式访问Objective-C中的方法参数,objective-c,Objective C,假设我有以下方法: -(void)methodWithVar1:(NSString*)var1 var2:(NSString*)var2; 现在,我当然可以直接使用变量名访问methodWithVar1:var2:中的var1和var2。但是我想做的是类似methodArgs[0]和methodArgs[1]的东西来访问变量 有办法做到这一点吗?我已经查看了runtime.h,但没有看到任何有帮助的内容 我为什么要这样做? 在某些情况下,当调用方法时,我希望阻止该方法执行,但允许它在另一时刻

假设我有以下方法:

 -(void)methodWithVar1:(NSString*)var1 var2:(NSString*)var2;
现在,我当然可以直接使用变量名访问methodWithVar1:var2:中的var1和var2。但是我想做的是类似methodArgs[0]和methodArgs[1]的东西来访问变量

有办法做到这一点吗?我已经查看了runtime.h,但没有看到任何有帮助的内容

我为什么要这样做?

在某些情况下,当调用方法时,我希望阻止该方法执行,但允许它在另一时刻执行。我通过创建一个NSInvocation对象来实现这一点,该对象允许我在需要时“重新调用”该方法。但是,NSInvocation要求调用setArgument:atIndex:,这是我必须手动完成的。如果方法每次都发生更改,则需要更新NSINVIcation的总体。我想避免手动更新它,并有一个通用的方法来做

示例

-(void)methodWithVar1:(NSString*)var1 var2:(NSString*)var2{

    if (someCheckToSeeIfICannotRun) {

        NSMethodSignature * methodSignature = 
        [self.class instanceMethodSignatureForSelector:_cmd];

        KWInvocation * invocation = 
        [KWInvocation invocationWithMethodSignature:methodSignature];

        [invocation.invocation setTarget:self];
        [invocation.invocation setSelector:_cmd];
        [invocation.invocation setArgument:&var1 atIndex:2];// This and
        [invocation.invocation setArgument:&var2 atIndex:3];// this, I would prefer to make generic
        [invocation.invocation retainArguments];
        //
        // Store invocation somewhere so I can call it later...
        //
    }
    else {
        // Let the method run as normal
    }
}

我认为这可以帮助你:

#import <objc/runtime.h>

void logArguments(const id* selfPtr)
{
    id obj = *selfPtr;
    SEL sel = *(SEL*)(void*)(--selfPtr);

    Method m  = class_getInstanceMethod([obj class], sel);

    for (unsigned int cnt = method_getNumberOfArguments(m) - 2; 0 != cnt; --cnt)
    {
        NSLog(@"arg: %@", *(--selfPtr));
    }
}
#导入
无效日志参数(常量id*selfPtr)
{
id obj=*selfPtr;
SEL=*(SEL*)(void*)(-selfPtr);
方法m=类\ getInstanceMethod([obj类],sel);
for(unsigned int cnt=method_getNumberOfArguments(m)-2;0!=cnt;--cnt)
{
NSLog(@“arg:%@,*(-selfPtr));
}
}

您可以调用
logArguments(&self)
在任何方法中,都有一个限制:所有参数都应该是objective-c对象。

为什么要这样做?@JoeFryer我需要通过NSInvocation缓存对方法的调用,但为了使NSInvocation中充满var1和var2的通用对象,我需要这样做。如果开发人员通过添加或删除变量来更改方法,那么NSInvocation部分需要更新,我希望避免手动更新。Hmmm ok。您可能会发现这个问题很有趣:。这一个:。看起来很有希望,我们将尝试一下,看看。碰巧所有的参数都是objective-c对象,我已经尝试过了,并且似乎按照预期工作,谢谢!