如何在运行时记录参数?

时间:2011-06-22 14:47:50

标签: objective-c

我创建了一个新函数来记录运行时类中的每个方法。

我遇到的问题是:

id value = va_arg(stackFrame, id);

不转换参数内的对象类型。

对我做错了什么的任何想法?还有另一种方法吗?

void DebugArguments ( id self, SEL _cmd,...)

{

id receiver = self;
SEL receiverSelector = _cmd;

va_list stackFrame;

va_start(stackFrame, _cmd);

NSMethodSignature *signature
= [receiver methodSignatureForSelector:receiverSelector];

NSUInteger count = [signature numberOfArguments];

NSUInteger index = 2;

for (; index < count; index++)
{

    id value = va_arg(stackFrame, id);
        if (!value)
        {
            NSLog(@"Arguments: %@",value);    
        }
} 
va_end(stackFrame);

}

1 个答案:

答案 0 :(得分:1)

  

我从这样的类调用函数InitDebug: -   (void)MyTest:(NSString *)string {
  InitDebug(self,_cmd); } 我希望   从中记录Argument字符串   方法MyTest。

将来,显示所有代码会很有帮助。

无论如何,你不能这样做;当你调用InitDebug(...)时,你正在将一个新帧推到堆栈上,va_arg()将在该帧的上下文中解码,而不是周围的帧。你也不能“上堆”并开始在调用帧的参数中进行grubing,因为不能保证调用帧甚至在那时保留。

如果你真的想做这样的事情,你可能想要子类NSProxy并使用它是调用者和你要记录的任何对象之间的代理。然后,您可以利用Objective-C的内置转发机制来查看参数。