2012-03-29 7 views
1

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?

+1

Bevor das Rad neu zu erfinden, haben Sie in Instrumente geschaut? – JustSid

+0

Machst du das, weil a) du es schneller laufen lassen willst oder b) du nur die Messung wissen willst? –

+0

Ich möchte die Informationen von meinen Beta-Testern sammeln, aber ich möchte nicht # überall. –

Antwort

Verwandte Themen