Kürzlich fing ich an, mich mit Objektiv C zu beschäftigen. Bisher habe ich angefangen, einfache Codes zu schreiben, die jeder Neuling tut, um zu verstehen, wie das Programmiermodell funktioniert. Als ich anfing, über Protokoll zu lernen, wurde ich plötzlich verwirrt. Ich bin im Grunde genommen von java
background, also dachte ich, ** Protokoll muss ähnlich sein wie Interface
.
Also die Frage nach Protokoll ist,
Warum benötigt ein Protokoll optionale Funktionen? wie Code unten,
%Vor% Der obige Code hat mir nicht geholfen, zu verstehen. Der Zweck des Protokolls (Schnittstelle in Java) besteht darin, Programmierer einzubinden, um sicherzustellen, dass sie alle aufgelisteten Methoden innerhalb der Klasse implementiert haben, die dieses Protokoll implementiert. Warum brauchen wir @optional
?
Wenn jemand das jemals benutzt hat, Könnten Sie bitte Ihre Gedanken darüber teilen, wie Ihnen dieses Paradigma geholfen hat?
Danke
Mein Ansatz für @optional
ist, dass es eine garantierte (aber unnötige) Anpassung des Verhaltens von Objekten ermöglicht. Betrachte UITableViewDataSource
Protokoll. Es hat 11 Methoden, obwohl, um eine funktionale Tabelle zu machen, müssen Sie nur 2 von ihnen implementieren. Andere 9 Methoden gibt es nur für die Tabellenanpassung und Apple selbst bietet sinnvolle Standardeinstellungen.
Protokolle werden oft verwendet, um einer Klasse bestimmte Funktionen zu geben. Es ist jedoch nicht immer notwendig, dass alle Methoden in einem Protokoll für eine bestimmte Aufgabe definiert sind. Die Methoden, die nicht überall für eine Klasse erforderlich sind, um ein bestimmtes Protokoll zu "sein", sind optional.
Häufig werden Protokolle verwendet, um Delegierte zu definieren. Um eine Klasse zu einem möglichen Delegaten (mehr oder weniger wie ein Callback) einer anderen Klasse zu machen, muss sie auf bestimmte Nachrichten (Methodenaufrufe) reagieren, die in einem Protokoll definiert sind. Für einige Gelegenheiten werden bestimmte Methoden des Delegierten niemals aufgerufen, da sie nicht für die Situation und das Setup gelten. Solche Methoden können im Protokoll optional gemacht werden, sodass sie nicht im Delegaten implementiert werden müssen. Wenn sie alle benötigt würden, wie in Java, würden sie wahrscheinlich sowieso als leere Methoden implementiert werden.
Die Tatsache, dass Methoden dynamisch aufgerufen werden, macht das viel einfacher, denke ich. Eine Klasse, die den Delegaten aufruft, kann tatsächlich prüfen, ob eine Methode für den Delegaten implementiert ist oder nicht, bevor sie versucht, sie aufzurufen.
Einfach. Objective-C hat uns die Möglichkeit gegeben, die Implementierung von Methoden zu überspringen, die wir nicht brauchen.
Consier KeyListener
in Java. Wenn Sie es implementieren, müssen Sie alle Methoden implementieren keyPressed (KeyEvent e) , SchlüsselReleased (KeyEvent e) und keyTyped (KeyEvent e) , obwohl Sie nicht alle benötigen.
Aber in Objective-C können Sie @optional
-Methoden angeben, um unnötige Methodenimplementierungen zu vermeiden.
Aber manche tun das.
Also @optional
ist für diejenigen, die fliegen können, implementiert.
In der Praxis müssen einige Methoden für einige Klassen implementiert werden, muss nicht für alle gelten.
In Objective C kann der Implementor des Protokolls dem Programmierer Flexibilität geben, um zu entscheiden, ob die Methode zur Anpassung der Klasse implementiert werden soll oder nicht, indem @optional
verwendet wird.
Bestes Beispiel ist UITableViewDataSource
.
Wie beantwortet Beispiele aus der realen Welt für @optional-Protokoll-Methoden Die optionale Methode im Protokoll könnte nach einer bestimmten Reihe von Ereignissen ausgelöst werden. Um dennoch dem Protokoll zu entsprechen und es zu implementieren, benötigen Sie nur die erforderlichen Methoden und fügen Flexibilität hinzu.
Siehe auch die Apple-Dokumentation zu Protokollen Ссылка
Beachten Sie, dass es nicht wirklich dasselbe wie eine Java-Schnittstelle ist, da eine Klasse ein Protokoll implementieren kann, ohne dass es für die Implementierung deklariert ist.
Protokoll definiert Methoden, denen Ihre Klasse bei bestimmten Aufgaben entspricht, normalerweise ein Vertreter der Instanz einer anderen Klasse.
Zum Beispiel definiert das UITableViewDataSource-Protokoll Methoden wie - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
und - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
Das erste ist erforderlich, das andere ist optional. Da die Tabellenansicht wissen muss, wie viele Zeilen angezeigt werden sollen, muss sie nicht wissen, wie viele Abschnitte (standardmäßig 1 Abschnitt) angezeigt werden. Also wird die zweite Methode unter @optional in UITableView.h deklariert. Wenn Sie eine Klasse erstellen, die als Datenquelle für die Tabellenansicht fungiert, definieren Sie sie als @interface ClassName : SuperClassName <UITableViewDataSource>
, was dem Compiler mitteilt, dass Ihre Klasse diesem Protokoll entspricht.
Wenn Sie die erste Methode nicht implementieren, wird der Compiler Ihnen sagen, dass Sie eine unvollständige Implementierung haben, aber wenn Sie keine zweite implementieren, wird Code ohne Warnung erstellt und ausgeführt.
Objective-C-Protokolle sind tatsächlich Java-Interfaces ähnlich. Sie bieten eine Abstraktionsebene, die Polymorphie in allen Klassen ermöglicht, die Ihre protokollaktivierte Klasse verwenden. Dies bedeutet, dass alle Klassen, die eine Ihrer Protokollimplementierungen verwenden, sicher sein können, dass bestimmte Methoden verfügbar sind.
Optionale Methoden sind genau das, was sie sagen: optional. Jede Klasse, die ein Protokoll anwendet, kann diese Methoden implementieren, aber sie sind nicht notwendig.
Die Verwendung von Protokollen ist am nützlichsten, wenn Sie ein Delegate-Entwurfsmuster implementieren. Wann immer Sie einen Delegaten für eine Klassen- oder Callback-Methode deklarieren, stellt das Erzwingen, dass ein Delegat einem Protokoll entspricht, sicher, dass alle erforderlichen Rückrufe verfügbar sind. In der UI-Entwicklung wird dadurch häufig sichergestellt, dass Ihre Ansichten auf aktualisierte Datenspeicher oder Netzwerkereignisse angemessen reagieren.
Ich schreibe ein HTTPRequest-Framework, das ein Protokoll mit folgenden Methoden hat, das von der Klasse implementiert werden muss, die mein Framework zum Hochladen / Herunterladen einer Datei verwendet,
%Vor%Nun muss die Klasse, die mein Framework zum Hochladen / Herunterladen einer Datei verwendet, die @ erforderlichen Methoden implementieren, um das Ergebnis des Uploads / Downloads zu erhalten, aber sie kann die @optional-Methode nur dann implementieren, wenn sie dies benötigt möchte den Upload / Download-Prozentsatz in einigen Fortschrittsanzeige anzeigen, es muss die fileUploadPercentage: Methode auch implementieren. Wenn die Klasse sich nicht um den abgeschlossenen Prozentsatz kümmert, muss diese Methode nicht implementiert werden. Hoffe, das hilft.
Tags und Links objective-c iphone ios interface xcode4