首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印发送到forwardInvocation的参数: NSProxy的子类

打印发送到forwardInvocation的参数: NSProxy的子类
EN

Stack Overflow用户
提问于 2009-11-29 10:26:23
回答 1查看 383关注 0票数 0

我只想通过打印选择器和参数来拦截发送到代理对象的消息。即使代理没有实现它们并且没有目标对象。请帮帮忙。我看过几个选项和Apple文档,但它们都假定您已经知道目标对象。我想在没有内存问题的情况下干净利落地做这件事。

代码语言:javascript
复制
 @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

谢谢,谢谢

EN

回答 1

Stack Overflow用户

发布于 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。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1814444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档