我创建了一个新函数来记录运行时类中的每个方法。
我遇到的问题是:
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);
}
答案 0 :(得分:1)
我从这样的类调用函数InitDebug: - (void)MyTest:(NSString *)string {
InitDebug(self,_cmd); } 我希望 从中记录Argument字符串 方法MyTest。
将来,显示所有代码会很有帮助。
无论如何,你不能这样做;当你调用InitDebug(...)
时,你正在将一个新帧推到堆栈上,va_arg()
将在该帧的上下文中解码,而不是周围的帧。你也不能“上堆”并开始在调用帧的参数中进行grubing,因为不能保证调用帧甚至在那时保留。
如果你真的想做这样的事情,你可能想要子类NSProxy
并使用它是调用者和你要记录的任何对象之间的代理。然后,您可以利用Objective-C的内置转发机制来查看参数。