gpt4 book ai didi

iphone - 打印发送到转发调用的参数 : subclass of NSProxy

转载 作者:行者123 更新时间:2023-12-03 17:37:12 27 4
gpt4 key购买 nike

我想通过打印选择器和参数来拦截发送到代理对象的消息。即使代理没有实现它们并且没有目标对象。请帮忙。我已经查看了几个选项和 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

谢谢谢谢

最佳答案

参数几乎可以是任何可以传递给方法的 C 类型,包括 Objective-C 类型。因此,它们不能用数组表示。

请注意,调用未在任何地方声明的方法没有任何意义。非常具体地说,编译器不知道如何在调用站点对参数进行编码以进行有效的 C 函数调用(方法调用实际上只是对 objc_msgSend() 或其变体的 C 函数调用) 。因此,回答您的“任何方法,即使它不存在”的问题;不,你不能这样做。

但是,您可以有效地消除所有编译器警告。如果您消除所有编译器警告 - 所有“method foo:bar: has can't be find”类型警告 - 那么这意味着编译器确实有足够的信息,你可以做任何你想做的事想要一个代理。

此外(当我详细了解您的问题时),无需在代理上实现任何方法。代理可以非常愉快地将任何方法调用转发到 NSInitation 中。如果编写正确,您可以让代理代表任何对象而不会出现问题。

您需要做的是使用 NSInitation 的 API 枚举参数,找出类型,然后相应地解码每个参数并正确打印。

您可以通过在 NSInitation 实例的方法签名上调用 numberOfArguments 来获取参数数量(该签名可以通过 methodSignature 方法获得)。

然后,循环遍历参数并在方法签名上调用 getArgumentTypeAtIndex: 以获取类型。然后,您很可能会在类型编码上编写一个 switch() 语句,然后调用 getArgument:atIndex: 并根据类型进行适当的解码。

注意参数 0 是 self,参数 1 是 _cmd;被调用方法的 SEL。

关于iphone - 打印发送到转发调用的参数 : subclass of NSProxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1814444/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com