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

时间:2014-03-05 09:26:45

标签: objective-c

假设我有以下方法:

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

现在我当然可以通过直接使用变量名来访问methodWithVar1:var2中的var1和var2。但我想做的是像methodArgs [0]和methodArgs [1]来访问变量。

有办法做到这一点吗?我看过runtime.h但看不到任何有用的东西。

为什么我要这样做?

在某些情况下,当调用方法时,我想阻止方法执行,但允许它在另一个时刻执行。我这样做是通过创建一个NSInvocation对象,允许我在我喜欢的时候“重新调用”该方法。但是,NSInvocation要求我调用setArgument:atIndex:,我必须手动完成。如果每次更改方法,则需要更新NSInvocation的填充。我想避免手动更新它,并采用通用的方法。

示例

-(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
    }

}

1 个答案:

答案 0 :(得分:1)

我认为这可以帮到你:

#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));
    }
}

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