Ich möchte einfache Profilerstellung für eine Funktion ausführen. Wenn eine Funktion gestartet wird, wird der Timer angezeigt. Wenn es beendet ist, wird die Zeit in das Protokoll gedruckt:Wie erstellt man einen Funktions-Wrapper in Runtime?
-(int) myFunc {
[MyProfileService startTimer:@"myFuncTimer"];
... code ...
[MyProfileService stopTimer:@"myFuncTimer"];
return result;
}
Diese Lösung ist mit dem Produktionscode unordentlich. eine elegantere soultion wäre statisch den Timer in der Klasse initialize Methode registrieren:
@implementation MyClass {
+(void) initialize {
[MyProfileService monitorFunction:@Selector(myFunc) inClass[Myclass class]];
}
Um dies zu achive, ich brauche die Umsetzung von myFunc mit einer neuen Implementierung zu ersetzen:
-(void) runProfileFunc(....) {
[MyProfileService startTimer:@"myFuncTimer"];
id result = [MyClass performSelector:@selector(myFunc) withObject: ...];
[MyProfileService stopTimer:@"myFuncTimer"];
return result;
}
mit objc/runtime kann ich Funktionen in Runtime umschalten. Wie kann ich die ursprüngliche Funktion reproduzieren und die Parameter an die ursprüngliche Funktion innerhalb des Wrappers übergeben?
Bevor das Rad neu zu erfinden, haben Sie in Instrumente geschaut? – JustSid
Machst du das, weil a) du es schneller laufen lassen willst oder b) du nur die Messung wissen willst? –
Ich möchte die Informationen von meinen Beta-Testern sammeln, aber ich möchte nicht # überall. –