Frage

Wie kann ich legte einen „Haken“ auf ein Objekt, so kann ich sehen, welche Nachrichten an ihn gesendet werden? (Dh tut ein NSLog () jedes Mal, wenn eine Nachricht an ein Objekt gesendet wird).

Ich denke, Rückruf zuvor getan zu sehen, aber ich vergessen, wie. Ich denke, es könnte mich nach unten helfen zu verfolgen, warum ein Teil meiner Code funktioniert nicht.

War es hilfreich?

Lösung

Sie können auch a href verwenden <= "http://www.mikeash.com/?page=pyblog/friday-qa-2009-03-27-objective-c-message-forwarding.html" rel =“ nofollow noreferrer "> Objective-c-Forwarding . Grundsätzlich können Sie einen Proxy-Objekt erstellen, das die Methoden leitet dann den Anruf an das Original anmeldet. Sehen Sie meinen Blogeintrag für weitere Details.

@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

Andere Tipps

Der beste Weg, dies zu tun ist mit dtrace oder einem Instrumenten-Skript. Mit DTrace können Sie Folgendes tun:

Schreiben Sie das folgende Skript als objc-calls.d

#pragma D option quiet
objc$target:::entry
{
   printf("%s %s\n", probemod, probefunc);
}

Dann die App starten Sie das Skript:

setenv DYLD_SHARED_REGION avoid
sudo dtrace -s objc-calls.d -c /Path/To/Your/App/Binary

Sie können auch ein eigenes Instrument mit einer ähnlich dtrace Sonde bauen.

Im Anschluss an Louis Gerbarg Kommentar aus dem letzten Jahr, ist es auch nützlich, durch Klassennamen leicht Filter in der Lage sein.

Versuchen Sie, das folgende D-Skript:

 #!/usr/sbin/dtrace -s
 #pragma D option quiet
 objc$target:::entry
 /strstr(probemod,$$1) != NULL/
 {
     printf("%s %s\n", probemod, probefunc);
 }

Speichern sie, chmod a+x objc-calls.d und dann sudo objc-calls.d -c /Your/Binary NSObject tun nur die Anrufungen zu sehen, zu NSObject bezogen (und seine Kategorien).

Sie könnten ein NSProxy Objekt verwenden und die forwardInvocation: Methode außer Kraft setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top