Was ist der Unterschied zwischen einer Kategorie und einer Klassenerweiterung? Ich glaube, beide werden verwendet, um benutzerdefinierte Methoden in vorhandenen Klassen hinzuzufügen. Kann jemand Licht ins Dunkel bringen? Eine Prüfung mit Code wird sehr geschätzt.
objective-c
Abhinav
quelle
quelle
Antworten:
Eine Kategorie ist eine Möglichkeit, Methoden zu vorhandenen Klassen hinzuzufügen. Sie befinden sich normalerweise in Dateien mit dem Namen "Class + CategoryName.h", wie "NSView + CustomAdditions.h" (und natürlich .m).
Eine Klassenerweiterung ist eine Kategorie mit Ausnahme von zwei Hauptunterschieden:
Die Kategorie hat keinen Namen. Es wird so deklariert:
Die Implementierung der Erweiterung muss sich im Hauptblock @implementation der Datei befinden.
Es ist durchaus üblich, dass oben in einer .m-Datei eine Klassenerweiterung angezeigt wird, die weitere Methoden für die Klasse deklariert, die dann unten im Hauptabschnitt @implementation der Klasse implementiert werden. Dies ist eine Möglichkeit, "pseudo-private" Methoden zu deklarieren (pseudo-privat, da sie nicht wirklich privat sind, nur nicht extern verfügbar gemacht werden).
quelle
=> Wenn Sie in Ziel C einer Klasse ohne Vererbung weitere Funktionen hinzufügen möchten, verwenden Sie einfach die Kategorie dafür.
=> es kommt mit einer eigenen .h und .m Datei
=> wird
Category
verwendet, um neue Methoden und keine Eigenschaften hinzuzufügen.- Sie erhalten zwei Dateien .h und .m mit dem Dateinamen ( Klassenname + Kategoriename.h und Klassenname + Kategoriename.m ).
und im Erweiterungsfall erhalten Sie
-Sie erhalten nur eine Datei mit dem Namen className_extensionName.h
quelle
Kategorie ist eine Möglichkeit, einer Klasse Methoden hinzuzufügen, unabhängig davon, ob Quellcode verfügbar ist oder nicht. Dies bedeutet, dass Sie Grundlagenklassen wie
NSString
und auch Ihren eigenen benutzerdefinierten Klassen Kategorien hinzufügen können .Die Erweiterung kann nur zu den Klassen hinzugefügt werden, deren Quellcode verfügbar ist, da der Compiler den Quellcode und die Erweiterung gleichzeitig kompiliert.
Wir können zusätzliche Instanzvariablen und Eigenschaften in der Klassenerweiterung hinzufügen, jedoch nicht in der Kategorie.
Jede Variable und Methode in der Erweiterung ist nicht einmal für geerbte Klassen zugänglich.
Kategorie und Erweiterung sind grundsätzlich für die Verarbeitung großer Codebasen ausgelegt. Kategorie ist jedoch eine Möglichkeit, die Klassen-API in mehreren Quelldateien zu erweitern, während Erweiterung eine Möglichkeit ist, erforderliche Methoden außerhalb der Hauptschnittstellendatei hinzuzufügen.
Verwenden Sie die Kategorie, wenn Sie denselben Klassencode nach verschiedenen Funktionen in verschiedene Quelldateien aufteilen müssen, und die Erweiterung, wenn Sie nur einige erforderliche Methoden zu einer vorhandenen Klasse außerhalb der Hauptschnittstellendatei hinzufügen müssen. Wenn Sie eine öffentlich deklarierte Instanzvariable in einer Klasse ändern müssen, z. B. schreibgeschützt in readwrite, können Sie sie in der Erweiterung erneut deklarieren.
quelle
Erweiterung : Um Methoden privat zu machen und Eigenschaften unserer eigenen benutzerdefinierten Klasse hinzuzufügen, nicht der Apple-Klasse.
Kategorie : Um der vorhandenen Klasse weitere Methoden hinzuzufügen, nicht die Eigenschaft, kann sie sowohl für benutzerdefinierte Klassen als auch für Apple-Klassen wie verwendet werden
NSString
.quelle
Wir können auch Eigenschaften haben, indem wir die zugeordnete Eigenschaft in der Kategorieklasse festlegen.
Siehe: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/
quelle
Ich denke, es ist nicht der Weg, Kategorie zu deklarieren. Kategorie muss einen Namen haben
beispielsweise
Von Apple für NSMutableArray deklariert
quelle
ios-Erweiterung ähnlich wie c #, abstrakte Java-Klasse oder Schnittstelle
ios-Kategorie ähnlich wie c #, Java-Klassenerweiterung
quelle
Kategorien
Kategorien werden verwendet, wenn Sie eine Datei mit einer großen Anzahl von Methoden erstellen. Sie bieten Ihnen daher die Möglichkeit, eine einzelne Klasse in verschiedene Module zu unterteilen. Wenn Änderungen an den Kategorien vorgenommen werden, verschwendet der Compiler keine Zeit, um das gesamte Projekt zu kompilieren .Kategorien können keine neuen Variablen oder Eigenschaften hinzufügen und zu ihrer übergeordneten Klasse suchen. Sie können eine Methode in einer Kategorie überschreiben, dies ist jedoch keine gute Idee, da die Methode nicht weiter überschrieben werden kann. Außerdem kann der Ablauf ausgeführt werden, da alle Kategorien dies haben Zur Laufzeit können dieselbe Hierarchieebene und damit zwei Kategorien vorhanden sein, die zur selben übergeordneten Klasse gehören. Auch geschützte Methoden können mithilfe von Kategorien erstellt werden
Erweiterungen
Mit Erweiterungen können Sie die Eigenschaft überschreiben oder der vorhandenen übergeordneten Klasse eine neue Eigenschaft hinzufügen. Synthetisch identisch mit Kategorien, die keinen Namen haben und als @interface class () dargestellt werden. Es ist keine .m-Datei vorhanden und die in der Erweiterung deklarierte Methode muss implementiert werden in @implementation der übergeordneten Datei
Weitere Hilfe unter diesem Link
quelle
Hier ist mein Verständnis:
Erweiterungen werden normalerweise verwendet, um unserer eigenen " benutzerdefinierten Klasse " zusätzliche Funktionen hinzuzufügen . Wir können private Methoden oder Eigenschaften hinzufügen, die die Klassenschnittstelle erweitern und innerhalb der Implementierung der Klasse verwendet werden können.
Erweiterungen sind in dieselbe Datei wie die Klasse zu schreiben. Daher können Sie keine Erweiterungen für vordefinierte Typen wie String, Float usw. schreiben.
Auf der anderen Seite können Kategorien verwendet werden, um bereits vorhandenen Klassen zusätzliche Methoden hinzuzufügen. Beispiel: Wir können unsere eigenen Methoden erstellen, indem wir die String-Klasse erweitern. Beachten Sie, dass wir in den Kategorien keine zusätzlichen Eigenschaften erstellen können . Der Hauptvorteil von Kategorien besteht auch darin, dass wir die Kategorien in jede andere Datei außerhalb der Datei schreiben können, in der Ihre Klasse beendet wird.
Auch beim Erstellen von Kategorien sollten Sie in den Klammern einen Namen dafür angeben. Für die Erweiterung ist jedoch kein Name erforderlich. Daher werden sie manchmal auch als anonyme Kategorien bezeichnet.
quelle