Beste Weg, zu überprüfen, ob Delegierte reagiert auf optional selector
Habe ich benutzt, Verpackung Versand @optional
delegate-Methoden in:
if ([self.delegate respondsToSelector:@selector(method:)]) {
[self.delegate method:obj];
}
Es funktioniert gut, aber wenn es gibt viele delegate-Methoden, es sieht aus wie das duplizieren respondToSelector:
code...
Irgendwann Zeit habe ich respondsToSelector:
zu trennen Methode:
//ignore warning
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
- (void)performDelegateSelector:(SEL)selector withObject:(id)obj {
if ([self.delegate respondsToSelector:selector]) {
[self.delegate performSelector:selector withObject:obj];
}
}
Als Ergebnis habe ich nur eine respondToSelector: überprüfen, aber Es immer noch nicht sehen, wie gut verbessert.
[self performDelegateSelector:@selector(method:) withObject:self];
Was denkst du? Macht es Sinn in der Verwendung von einigen Helfern oder Kategorie zu wickeln senden alle @optional
delegate-Methoden, oder ist es etwas, das nicht sollte verbessert werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Performance-Weise, es hängt davon ab, welchen Einsatz Sie machen die Delegierten, ob es direkt Auswirkungen auf die UI (in dem Fall, dass Sie wollen, haben eine schnellere Reaktionszeit) etc.
Einen guten Geschwindigkeits-Optimierung ist, sich zu registrieren alle Methoden implementiert, die von den Delegierten in einer Daten-Struktur, wenn Sie zuerst die Stellvertretung. Sie tun konnten:
Dann können Sie einfach tun
Überprüfen Sie diese große Antwort für die ausführliche Erklärung.
Können Sie ein Trampolin für dieses. Ein Trampolin ist ein Objekt, das leitet Nachrichten an ein anderes Objekt. Hier ist eine einfache DelegateTrampoline.
Hier ist, wie Sie es benutzen würden:
Einige Hinweise:
NSInvocation
Objekt, die mehrere hundert mal langsamer als ein einfacher Methodenaufruf. Das heißt, es sei denn, Sie fordern Ihre Delegat-Methode in einer engen Schleife, es ist wahrscheinlich nicht ein problem.delegateTrampoline
Typid
. Dies ermöglicht die übergabe von beliebigen Selektoren, um es. Es bedeutet aber auch, dass der compiler nicht erkennen, wenn Sie passieren einen SelektordelegateTrampoline
, die nicht in das Protokoll. Wirst du Abstürzen zur Laufzeit, wenn Sie dies tun. Der compiler kann erkennen, wenn Sie passieren ein völlig unbekannter Selektor, so dass es dann Fang einfach Tippfehler.Oben auf Antwort @micantox ich möchte hinzufügen, dass statt
struct
könnten SieNS_OPTIONS
zu definierenbitmask
.Dann könnten Sie erstellen, die Eigenschaft, die halten kann
bitmask
:@property (nonatomic, assign) MyDelegateOptions delegateOptions;
tun und prüfen, ob delegieren
respondsToSelector:
in Ihre setter wieDann können Sie einfach überprüfen belegt bit-Muster durch die Verwendung
bitwise AND
Wie Sie sehen können, die Verwendung von
bitwise AND
zurücktrue
wenn etwas fürMyDelegateOptionDidFinishedWithTaskOne
wird als 1, auch wenn die anderen bits sind auch gesetzt werden.So, wenn Sie vermuten, dass
delegate
war aktiviert, in den setter und auf dieser Basis IhredelegateOptions
hält die bit-Muster der 00000111 und IhreMyDelegateOptionDidFinishedWithTaskOne
repräsentiert die bit-Muster der 00000001 dann einfach mitbitwise AND
erhalten Sie
true
mit Ihrem bedingten Anweisung.Lohnt es sich, notting, dass dies übertrieben ist, in Situationen, wenn Sie brauchen, um zu überprüfen, Ihre
delegate
nur einmal oder zweimal.