Unterschied zwischen Kategorie und Klassenerweiterung?


85

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.



3
Akusete, Seite kann nicht gefunden werden.
Adil Hussain

hier deutlich dargestellt, code.tutsplus.com/tutorials/…
grassyburrito

Antworten:


103

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:

  1. Die Kategorie hat keinen Namen. Es wird so deklariert:

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    @Ende
  2. 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).


13
In Class-Extensiosn können Sie Eigenschaften von einer (öffentlichen) schreibgeschützten Eigenschaft überschreiben, um sie intern zu überschreiben. Und seit LLVM 1.5 können Sie noch mehr tun: Sie können jetzt Instanzvariablen in einer Klassenerweiterung deklarieren, damit sie nicht mehr zur regulären Schnittstelle gehören.
Max Seelemann

Warum eine Klassenerweiterung hinzufügen, wenn Sie diese Methoden und Eigenschaften einfach in die Klasse implementieren könnten? Scheint mir ein wenig überflüssig.
Benutzer1721803

1
@ user1721803 Wie Dave vorgeschlagen hat, möchten Sie möglicherweise einige Eigenschaften / Methoden unbelichtet lassen. In diesem Fall werden Erweiterungen verwendet. Betrachten Sie eine Ansicht, Sie könnten alle Ihre IBOutlets und IBActions in Erweiterung verbinden und Methoden verfügbar machen, mit denen Outlets initialisiert / aktualisiert werden können, und Aktionen könnten zurück delegiert werden.
GoodSp33d

@MaxSeelemann Können Sie bitte demonstrieren, wie Sie mit einem kurzen Skript "eine (öffentliche) schreibgeschützte Eigenschaft, die intern schreibgeschützt werden soll" erstellen? Vielen Dank.
Allenlinli

Diese Antwort gibt die Erweiterung in der Datei "Class + CategoryName.swift" an. Ist sie korrekt?
Rishi

47
  1. Kategorie

=> 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 Categoryverwendet, um neue Methoden und keine Eigenschaften hinzuzufügen.

  1. Klassenerweiterung
-> In Objective C, when you want to make behaviour of some property private you use class extension.

-> it comes with **.h** file only.

-> mainly for properties.

Hinweis: Wenn wir eine neue Datei hinzufügen und eine Option für die Ziel-c-Kategorie auswählen, werden Kategorie und "Kategorie auf" und nicht "Unterklasse von" angezeigt

@interface className (categoryName)
@end

- Sie erhalten zwei Dateien .h und .m mit dem Dateinamen ( Klassenname + Kategoriename.h und Klassenname + Kategoriename.m ).

und im Erweiterungsfall erhalten Sie

@interface className()
@end

-Sie erhalten nur eine Datei mit dem Namen className_extensionName.h

  • In der Kategorie besitzt du die Klasse nicht, aber in der Erweiterung bist du es.

5
@ Prasanna: Klassenerweiterung kommt nur mit .m Datei und nicht in .h
Saggy

1
Klassenerweiterung kommt mit einer .h-Datei und nicht mit einer .m
Nishu_Priya

32
  1. 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 NSStringund 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.

  2. Wir können zusätzliche Instanzvariablen und Eigenschaften in der Klassenerweiterung hinzufügen, jedoch nicht in der Kategorie.

  3. Jede Variable und Methode in der Erweiterung ist nicht einmal für geerbte Klassen zugänglich.

  4. 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.

  5. 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.


3
Ich habe 5 ähnliche Fragen mit vielen Antworten gelesen, und das ist das Beste. Danke dir!
Honey

1
Sie können auch Eigenschaften in der Kategorie hinzufügen. Siehe @ Peby-Antwort.
Atulkhatri

6

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.


Einfach und elegant. Weiter so
Abdul Yasin

3

Wir können auch Eigenschaften haben, indem wir die zugeordnete Eigenschaft in der Kategorieklasse festlegen.

@interface SomeClass (Private)

@property (nonatomic, assign) id newProperty;

@end

NSString * const kNewPropertyKey = @"kNewPropertyKey";

@implementation SomeClass (Private)

@dynamic newProperty;

- (void)setNewProperty:(id)aObject
{
    objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}

- (id)newProperty
{
    return objc_getAssociatedObject(self, kNewPropertyKey);
}

@end

Siehe: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/


2
@interface SomeClass ()


- (void) anAdditionalMethod;


@end

Ich denke, es ist nicht der Weg, Kategorie zu deklarieren. Kategorie muss einen Namen haben

@interface SomeClass (XYZ)


- (void) anAdditionalMethod;


@end

beispielsweise

@interface NSMutableArray (NSMutableArrayCreation)

+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;

@end

Von Apple für NSMutableArray deklariert


Dies ist, wie Sie deklarieren und erweitern, keine Kategorie -> @interface SomeClass ()
ChavirA

0

ios-Erweiterung ähnlich wie c #, abstrakte Java-Klasse oder Schnittstelle
ios-Kategorie ähnlich wie c #, Java-Klassenerweiterung


4
Ihre Antwort ist genau wie "Katze ist ähnlich wie Tiger und antwortet einem Blinden". Lol
Muruganandham K

1
es ist eigentlich nicht. Es ist die direkteste und schnellste Erklärung, wenn Sie C # oder Java kennen.
Add080bbA

Überhaupt nicht sehr beschreibend und beantwortete die Frage kaum.
KVISH

0

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


0

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.


Sie sind wenig aus der Bahn geraten.
Abdul Yasin

@iPhoneDeveloper Wir können die Erweiterung für vordefinierte Typen schreiben. Bitte überprüfen Sie diesen Link - stackoverflow.com/a/33942484/2060508
yo2bh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.