我只想通过打印选择器和参数来拦截发送到代理对象的消息。即使代理没有实现它们并且没有目标对象。请帮帮忙。我看过几个选项和Apple文档,但它们都假定您已经知道目标对象。我想在没有内存问题的情况下干净利落地做这件事。
@implementation MyProxy
-(void)forwardInvocation:(NSInvocation*)anInvocation
{
// at this point I would
//like to fetch the arguments and put on an array
NSMutableArray *myArgs = .....;
NSLog(@"Invoking selector %@", theSelector);
NSLog (myArgs); // this should print me the list of arguments to the method
}
@end
// e.g
MyProxy *proxy = [[MyProxy alloc] init];
[proxy SendMeAnyThing: @"hello"]; // this should print me arguments
or [proxy add: 12 to: 89 sub: 89]; // should print the arguments谢谢,谢谢
发布于 2009-11-29 13:10:49
参数几乎是任何C类型,包括Objective-C类型,可以传递给该方法。因此,它们不能在数组中表示。
注意,调用一个没有在任何地方声明的方法没有任何意义。具体地说,编译器不知道如何对调用点的参数进行编码以进行有效的C函数调用(方法调用实际上只是对objc_msgSend()或变体的C函数调用)。所以,回答你的“任何方法,即使它不存在”的问题;不,你不能这样做。
但是,您可以有效地消除所有编译器警告。如果您消除了所有编译器警告--所有"method foo:bar: has‘t be be“类型警告--那么这意味着编译器确实有足够的信息,您可以使用代理做任何您想做的事情。
此外(正如我在你的问题中读到的那样),没有必要在代理上实现任何方法。代理可以非常愉快地将任何方法调用转发到NSInvocation。如果编写正确,您可以使用代理来代替任何对象,而不会出现问题。
您需要做的是使用NSInvocation的API枚举参数,找出类型,然后相应地解码每个参数并适当地打印。
您可以通过在NSInvocation实例的方法签名上调用numberOfArguments来获取参数的数量(签名可以通过methodSignature方法获得)。
然后,遍历参数并在方法签名上调用getArgumentTypeAtIndex:以获取类型。然后,您很可能会在类型编码上编写一条switch()语句,然后调用getArgument:atIndex:并根据类型进行适当的解码。
请注意,参数0是self,参数1是_cmd;被调用的方法的SEL。
https://stackoverflow.com/questions/1814444
复制相似问题