如何在运行时创建函数包装器?

时间:2012-03-29 09:33:32

标签: objective-c reflection profiling runtime

我想在函数上运行简单的分析。当一个函数开始运行时,计时器会亮起。完成后,时间将打印到日志中:

-(int) myFunc {
    [MyProfileService startTimer:@"myFuncTimer"];
    ... code ...
    [MyProfileService stopTimer:@"myFuncTimer"];
    return result;
}

此解决方案正在弄乱生产代码。更优雅的灵魂将是在类初始化方法中静态注册计时器:

@implementation MyClass {

    +(void) initialize {
            [MyProfileService monitorFunction:@Selector(myFunc) inClass[Myclass class]];
    }

为了实现这个目标,我需要用新的实现替换myFunc的实现:

-(void) runProfileFunc(....) {
    [MyProfileService startTimer:@"myFuncTimer"];
    id result = [MyClass performSelector:@selector(myFunc) withObject: ...];
    [MyProfileService stopTimer:@"myFuncTimer"];
    return result;
}

使用objc / runtime我可以在运行时切换函数。 如何复制原始函数signiture并将参数传递给包装器中的原始函数?

1 个答案:

答案 0 :(得分:0)

我已经实现了一个实用程序:

https://github.com/tomersh/TheWrapper