Frage

Mein Verständnis ist, dass Protokolle wie Schnittstellen in anderen Sprachen sind - sie erwarteten Methoden erklären - (. Vielleicht sogar Typen, die Sie nicht besitzen), während Kategorien können Sie neue Methoden zu bestehenden Typen hinzuzufügen

Warum dann nicht manchmal das iPhone SDK Kategorien verwenden für Delegattypen deklarieren? Normalerweise würde ich alle Delegierten erwartet getippt id sein aber es gibt viele Beispiele, bei denen dies nicht der Fall ist.

Zum Beispiel finden Sie NSURLConnection. Sein Delegat „id“ eingegeben und der ‚Vertrag‘ als Kategorie auf NSObject (NSURLConnectionDelegate) erklärt.

Also: Was ist die Motivation für die Kategorien in diesen Fällen mit

War es hilfreich?

Lösung

Objective-C 2.0 die @optional Protokoll Richtlinie eingeführt, so dass Sie bestimmt Protokoll Methoden erklären, optional zu sein. Vor dem Obj-C 2.0, wurden Kategorien verwendet optional Delegatmethoden (insbesondere Kategorien auf NSObject, die genannt werden informelle Protokolle ) zu ermöglichen.

Meine Vermutung ist, dass die meisten der Kategorie-statt-of-Protokoll Verwendung im iPhone SDK ein Überbleibsel aus den entsprechenden Mac-Klassen ist. Zum Beispiel existiert NSURLConnection sowohl im Mac und iPhone SDKs, so wird der Code wahrscheinlich geteilt. Da Apple hat noch nicht durchlaufen alle der Mac-Klassen ändern formale Protokolle zu verwenden, sind wir mit etwas von einer Inkonsistenz links.

Andere Tipps

Bis zur Revision von Objective-C, die mit OS X 10.5 und dem iPhone SDK ausgerollt wurde, „Objective-C 2.0“ genannt, könnte man nur Fakultativprotokolle machen anhand von Kategorien. In Objective-C 2.0 wurde ein neues @optional Schlüsselwort in Protokollen hinzugefügt zu markieren, welche Methoden waren optional (der Rest wird implizit erforderlich).

Also ich denke, was Sie sehen, ist eine leichte Halt über von den früheren Tagen vor dem @optional Stichwort.

Edit: das Follow-up zu beantworten, die in der ursprünglichen Frage aufgetaucht: Die Motivation für eine Kategorie mit auf NSObject / id für ein informelles Protokoll ist zum Teil zu dokumentieren und zu Gruppe, welche Methoden des Objekt in seiner Datenquelle nennen kann (oder delegieren oder was auch immer), und zu einem geringeren Grad Compiler-Warnungen zu vermeiden, dass Sie Methoden sind aufrufen, die der Compiler wird nicht kennt im Objekt vorhanden sein, der den Anruf empfängt. Stellen Sie sich vor, denjenigen zu sein, die Klasse zu implementieren, die diese Datenquelle Methoden aufrufen - Sie würden wahrscheinlich überprüfen, ob das Verfahren unter Verwendung vorliegt [obj respondsToSelector: @selector (my: Datenquelle: Methode :)], wenn Sie daran interessiert sind die in meinem Aufruf : Datenquelle: Methode. Methode für das Objekt obj

Das ist ein Vermächtnis kam aus Objective-C 1.0, die keine "Fakultativprotokoll-Methode" hat.

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