Warum deklariert dieses Codebeispiel auf der Dev-Site von Apple drei Interfaces für dieselbe Klasse?

8

Ich tauche in iOS-Entwicklung ein, während ich versuche, Objective-C zu verstehen, und ich bin immer noch in dieser Phase, in der ich Dinge sehe, die für einen erfahrenen C-Programmierer wie mich keinen Sinn ergeben. In diesem Spiel-Kit-Beispiel auf Apples Dev-Seite , eine der Header-Dateien deklariert eine Klassenschnittstelle, drei verschiedene Zeiten ...

%Vor%

Ich sehe, dass jede Schnittstelle unterschiedlich ist, aber den gleichen Klassennamen angeben.

  1. Was ist der Grund dafür?
  2. Ich habe das gleiche Verhalten auch in anderen Codebeispielen bemerkt. Nur anstatt mehrere Interfaces in der Headerdatei zu deklarieren, sehen Sie einen zusätzlichen @interface Block, der am oberen Rand der .m Implementierungsdatei deklariert ist, normalerweise über dem @ Implementierungsblock. Warum?

Vielen Dank im Voraus für Ihre Weisheit!

    
BeachRunnerFred 28.07.2010, 15:23
quelle

4 Antworten

9

Diese werden Kategorien genannt und Sie können sie in Klammern hinter dem Klassennamen sehen.

Sie werden verwendet, um Methoden in Chunks zu gruppieren, anstatt sie alle in einem großen Haufen zu haben. Sie können auch getrennt von der Hauptklassendeklaration platziert werden. Dies ist besonders nützlich in .m-Dateien, in denen Sie u. U. Hilfsmethoden für Ihre Klasse erstellen müssen, die jedoch aus anderen Gründen nicht für andere Objekte sichtbar sein sollen (also nicht in die .h-Datei) von den anderen Klassen importiert). Eine andere häufige Verwendung ist das Gruppieren von Methoden, die einer bestimmten logischen Kategorie , einem informellen Protokoll oder was auch immer Sie haben. Kategorien können benannt werden ( @interface MyClass (MyCategory) ) oder anonym ( @interface MyClass () ). Letzteres wird normalerweise für generische private Methoden in Ihrem Header verwendet.

(Der Grund, warum Sie Kategorien zum Deklarieren privater Methoden in Ihrer .m-Datei benötigen, ist, dass der Compiler die Methoden kennt - andernfalls erhalten Sie eine Warnung, wenn Sie versuchen, eine solche Methode aufzurufen.)

Sie können auch Kategorien verwenden, um Methoden zu vorhandenen Klassen hinzuzufügen. Zum Beispiel enthält UIKit eine Kategorie in NSString namens NSString (UIStringDrawing). Oder wenn du dein eigenes machen willst:

%Vor%

Beachten Sie, dass Sie keine Instanzvariablen mit einer Kategorie hinzufügen können.

    
jtbandes 28.07.2010, 15:32
quelle
4

Es definiert die Schnittstelle nicht dreimal - es gibt nur eine Schnittstelle.

Was Sie sehen, sind Kategorien, die der Klasse Methoden hinzufügen

Es gibt eine Basisschnittstelle, die die Attribute und einige Methoden definiert - es gibt nur eine davon und definiert, wie das Objekt im Speicher gespeichert wird und ist die einzige, die benötigt wird.

Objective C sucht nach Methoden zur Laufzeit. Diese Methoden müssen nicht zur Kompilierzeit gefunden werden und müssen daher nicht in den Headern / Interfaces usw. deklariert werden. Wenn sie nicht deklariert sind und Sie Code aufrufen, erhalten Sie Kompilierungszeitwarnungen.

In diesem Fall wird eine Kategorie mit einem leeren Namen für private Funktionen verwendet. Normalerweise lege ich diese Schnittstelle nur in die .m-Datei der Klasse, so dass sie für anderen Code nicht sichtbar ist, nicht in einer Kopfzeile.

Die zweite Kategorie besteht darin, die Methoden hinzuzufügen, damit der SessionManager das GKVoiceChatClient-Protokoll erfüllt. Der übliche Grund dafür ist, einen Code zu gruppieren, der ein bestimmtes Verhalten abdeckt.

Ein weiterer Grund für die Verwendung von Kategorien ist das Hinzufügen von Methoden zu einer vorhandenen Klasse wie NSString. Sie können eigene Methoden zum Hinzufügen von Kategorien erstellen, ohne die Klasse wie in vielen anderen OO-Sprachen wie Java und C ++ zu erstellen     

Mark 28.07.2010 15:34
quelle
1

Dies ist für Codepflegezwecke, glaube ich ... es ist leichter, durch die verschiedenen beschrifteten Schnittstellen zu schauen, zum Beispiel (VoiceManager), was für den Sprachmanageraufbau und damit verbundene Methoden ist, und Sie haben die eine Schnittstelle, die sich mit dem GK-Delegiertenmethoden und welche Interaktion mit gamekit es auch geben wird ... im Gegensatz zu einer riesigen Schnittstellendatei und der Suche nach dem, was Sie suchen ... Sie können die Implementierungen auch auf diese Weise teilen, so dass es einfacher ist Durchschauen und navigieren.

    
Daniel 28.07.2010 15:32
quelle
1

In Reihenfolge:

Die erste Schnittstellendeklaration ist die eigentliche Schnittstellendeklaration, die die Klasse als Unterklasse von NSObject deklariert und das GKSessionDelegate-Protokoll implementiert. Es deklariert auch die Instanzvariablen und eine Auswahl von Methoden.

Die zweite Schnittstellendeklaration ist eine Klassenerweiterung. Es kann als eine Art anonymer Kategorie betrachtet werden. Also werden wir es für jetzt überspringen und zurückkommen.

Die dritte Schnittstelle ist eine Kategoriedeklaration. Mit Kategorien können Sie zwei Dinge tun. Sie können die Klassenimplementierung auf mehrere Quelldateien aufteilen. Oben haben Sie

%Vor%

Die beiden @implementations müssen sich nicht in derselben Quelldatei befinden.

Das andere, was eine Kategorie tun kann, ist, dass Sie bereits existierende Klassen erweitern können. @interface NSString(MyStringMethods)...

Zurück zur Klassenerweiterung, das ist ein bisschen wie eine anonyme Kategorie. Die Implementierungen der darin deklarierten Methoden müssen sich im Hauptblock @implementation befinden. Der Zweck der Klassenerweiterung besteht darin, dass Sie private API separat von der Headerdatei der Klasse deklarieren können. Normalerweise stecke ich einen in die.m-Datei, wenn ich Methoden habe, die nur von der Klasse verwendet werden sollen. Beachten Sie, dass dies nur eine Einschränkung der Kompilierungszeit ist. Es gibt nichts, was eine Klassenerweiterungsnachricht daran hindern könnte, von jemand zur Laufzeit gesendet zu werden.

    
JeremyP 28.07.2010 16:41
quelle

Tags und Links