Как создать оболочку функции во время выполнения? - PullRequest
1 голос
/ 29 марта 2012

Я хочу запустить простое профилирование для функции.Когда функция начинает работать, таймер включается.по завершении в журнал заносится время:

-(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 я могу переключать функции во время выполнения.Как мне скопировать оригинальную подпись функции и передать параметры исходной функции внутри оболочки?

1 Ответ

0 голосов
/ 10 января 2013

Я реализовал утилиту, которая делает именно это:

https://github.com/tomersh/TheWrapper

...