假设我有以下方法:
-(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
}
}
答案 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对象。