假设我有以下方法:
-(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
}
}
我认为这可以帮助您:
#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对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句