objective-c - 捕获对象上的所有方法/消息调用

标签 objective-c cocoa nsobject

如何在一个对象上放置一个“钩子(Hook)”以便我可以看到发送给它的消息是什么? (即每次向对象发送消息时执行 NSLog())。

我想记得以前看过这个,但我忘记了是怎么做的。我想这可能会帮助我找出部分代码无法正常工作的原因。

最佳答案

您还可以使用 objective-c forwarding .基本上,您可以创建一个代理对象来记录方法,然后将调用转发给原始方法。看我的blog post了解更多详情。

@interface LoggerProxy : NSObject
{
    id original;
}

- (id)initWithOriginal:(id) value;

@end
@implementation LoggerProxy

- (id) initWithOriginal:(id)value
{
    if (self = [super init]) {
        original = value;
    }
    return self;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
    NSMethodSignature *sig = [super methodSignatureForSelector:sel];
    if(!sig)
    {
        sig = [original methodSignatureForSelector:sel];
    }
    return sig;
}

- (void)forwardInvocation:(NSInvocation *)inv
{
    NSLog(@"[%@ %@] %@ %@", original, inv,[inv methodSignature],
         NSStringFromSelector([inv selector]));
    [inv invokeWithTarget:original];
}

@end

关于objective-c - 捕获对象上的所有方法/消息调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1327925/

相关文章:

ios - 为 iOS 设置 Frank 时出现问题

objective-c - 使用鼠标切换 TableView 单元格的选定状态

cocoa - 从 LaunchDeamon 捕获应用程序终止

objective-c - 从服务器下载 cocoa 包

objective-c - 为什么 [self class] 响应 methodSignatureForSelector :?

iOS > "id"与 NSObject

objective-c - objc_setAssociatedObject 是如何工作的?

ios - 如何从 initWithCode 为自定义 Cell 设置 UIImageView 的图像属性?

ios - 清除 NSUserDefaults

ios - NSObject 在 StoryBoard/Interface Builder 中的作用是什么?