2016-09-21 1 views
0

Ich bin verwirrt über diese Delegate Methodenaufrufe.Was ist der Unterschied zwischen dem folgenden Delegiertenmethodenaufruf?

Welches ist die richtige Methode zum Aufrufen der Delegate-Methode?

@protocol XYZDelegate <NSObject> 

@required 
- (void)someMethod:(id)someObject; 
@end 

Methode 1:

- (void)someButtonAction:(UIButton *)sender { 

    if([self.delegate && [self.delegate respondsToSelector:@selector(someMethod:)]]) { 

    [self.delegate someMethod:sender]; 

    } 

} 

Methode 2:

- (void)someButtonAction:(UIButton *)sender { 

    if([self.delegate && [self.delegate respondsToSelector:@selector(someMethod:)]]) { 

    [self.delegate performSelector:@selector(someMethod:) withObject:sender]; 

    } 

} 
+0

Formatieren. Bitte. – Avi

+0

CMD K ist, wie man Formatierung repariert. Nicht die Leertaste oder die Löschtaste. – Fogmeister

+0

@Fogmeister, danke für Formatierungshinweis – HPM

Antwort

0

Der Unterschied ist, man die Delegatmethode direkt aufruft, während die andere die Laufzeit verwendet wird, durch performSelector , um es dynamisch zu machen.

Letztere ist weniger effizient und sinnlos, aber die Ergebnisse sind die gleichen.

+1

Nirgendwo in Bezug auf Laufzeit und Kompilierzeit 'performSelector' können Sie etwas mehr erklären .. :) – vaibhav

1

Sie sind beide ziemlich gleich. Sie werden zu demselben Ergebnis führen.

Die zweite ist etwas weniger effizient.

Was ich ändern würde die Linie ...

if([self.delegate && [self.delegate respondsToSelector:@selector(someMethod:)]]) {... 

Das Verfahren someMethod: wird durch das Protokoll erforderlich.

So können Sie es vollständig entfernen ...

- (void)someButtonAction:(UIButton *)sender { 
    [self.delegate someMethod:sender];  
} 

Und es wird immer noch funktionieren. Sie können eine Nachricht an nil senden und es wird nichts tun. Wenn der Delegat nicht null ist, wird er per Definition auf den Selektor antworten.

Wenn das Delegate-Objekt nicht der Methode entspricht, erhalten Sie einen Compilerfehler (oder nur eine Warnung?).

Wie auch immer, das sollte ausreichen.

Nur als eine Randnotiz. Ich persönlich bevorzuge die erste Methode und wenn es mehr als einen Parameter gibt, dann müßte man es so nennen, um die Parameter korrekt übergeben zu können.

+1

ich denke, es ist ein Compiler Fehler wie ich [hier] (https://developer.apple.com/reference/objectivec/1418956-nsobject/1418764-performselector) +1 für Sie .. – vaibhav

+0

Sie müssen nicht überprüfen, ob die Eigenschaft delegate nicht-null ist. Senden einer Nachricht auf "Null" tut nichts. – Avi

+0

@Avi ah, ja. Na sicher. Mein Kopf scheint jetzt im Swift-Modus zu sein, haha! : D – Fogmeister

Verwandte Themen