Frage

Ich versuche, herauszufinden, wie die Dinge wirklich Arbeit. Also dachte ich, wenn ich bestimmte Methoden Kategorien überschreiben würde, würde ich interessant NSLogs erhalten.

@implementation UIView(Learning)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    NSLog(@"-hitTest:withEvent: event=%@", event);
    return [self hitTest:point withEvent:event];
}
@end

Super und Selbst funktioniert hier nicht. Gibt es eine Möglichkeit, die ursprüngliche Implementierung von -hitTest zu nennen: withevent :? Was ich will, ist ein NSLog jedes Mal -hitTest: withevent:. Auf einem UIView genannt wird

Es ist nur für den persönlichen Lernzwecken. Ich mag die Veranstaltung Lieferung in Aktion sehen.

War es hilfreich?

Lösung

Sie können es tun, aber nicht eine Kategorie verwenden. Eine Kategorie ersetzt ein Verfahren. (Achtung, Auto Analogie) Wenn Sie ein Auto haben, und Sie das Auto zerstören und es mit einem neuen Auto zu ersetzen, können Sie immer noch das alte Auto benutzen? Nein, denn es ist weg und existiert nicht mehr. Das gleiche gilt für Kategorien.

Was Sie ist die Objective-C-Laufzeit verwenden, tun könnte das Verfahren unter einem anderen Namen zur Laufzeit (etwa „bogusHitTest:withEvent:“) hinzufügen möchten, tauschen dann die Implementierungen von hitTest:withEvent: und bogusHitTest:withEvent:. Auf diese Weise, wenn die Code-Anrufe hitTest:withEvent:, es geht um den Code auszuführen, die ursprünglich für bogusHitTest:withEvent: geschrieben wurden. Anschließend können Sie diesen Code haben invoke bogusHitTest:withEvent:, die die ursprüngliche Implementierung ausgeführt wird.

So ist die falsche Methode würde wie folgt aussehen:

- (UIView *) bogusHitTest:(CGPoint)point withEvent:(UIEvent *)event {
  NSLog(@"executing: %@", NSStringFromSelector(_cmd));
  return [self bogusHitTest:point withEvent:event];
}

Der Code der Methoden tauschen würde etwas entlang der Linien der folgenden sein:

Method bogusHitTest = class_getInstanceMethod([UIView class], @selector(bogusHitTest:withEvent:));
Method hitTest = class_getInstanceMethod([UIView class], @selector(hitTest:withEvent:));
method_exchangeImplementations(bogusHitTest, hitTest);

Andere Tipps

Was Sie tun möchten, ist gerufene Methode Swizzling: http://www.cocoadev.com/ index.pl?MethodSwizzling

Leider nein, es gibt keine Möglichkeit, die ursprüngliche Implementierung einer Methode zu nennen, dass Sie außer Kraft setzen. Sobald Sie es in der Kategorie implementieren haben Sie die ursprüngliche Methode eliminiert.

die gleiche Nachricht an super Senden soll in Ihrer Methode arbeiten; es wird das Verfahren auf der übergeordneten Klasse als normal bezeichnen (wenn vorhanden).

die gleiche Nachricht an self Senden wird eine Endlosschleife erzeugen, wie ich bin sicher, dass Sie entdeckt haben.

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