Ich habe gelesen, dass NSArray so etwas ist. Klingt schwer. Ich habe hier auf meinem Schreibtisch 7 wirklich dicke Bücher über Objective-C, Cocoa und C. Keiner von ihnen erwähnt Class Cluster überhaupt, zumindest kann ich es nicht im Index am Ende der Bücher finden. Also, was ist das?
objective-c
cocoa
cocoa-design-patterns
class-cluster
offener Frosch
quelle
quelle
Antworten:
Von Apple docs ... . Kurz gesagt, es handelt sich um ein Entwurfsmuster, das im Foundation-Framework verwendet wird, weshalb es wahrscheinlich nicht in ObjC-Büchern erwähnt wird.
quelle
Ich weiß nicht, worauf sich das CDP bezieht, auf das Steve verwiesen hat, aber im Grunde ist der Objective-C-Klassencluster ein Konstrukt, das die Implementierung des abstrakten Factory- Musters unterstützt.
Die Idee ist einfach : Sie möchten eine Factory-Schnittstelle (Cluster) bereitstellen, die mit minimaler Beschreibung eine bestimmte konkrete Instanz eines Factory-Objekts herstellt und zurückgibt, die dem Verhalten der von der Factory-Schnittstelle (Cluster) beschriebenen Clusterfamilie entspricht.
Ein einfaches konkretes Beispiel : Dieses Beispiel bietet eine Lachfabrik, in der konkrete Klassen bestimmter Lachtypen (z. B. Guffaw, Giggle) hergestellt werden. Achten Sie auf die Methode Laugh initWithLaughter : .
In Laugh.h:
In Laugh.m:
quelle
.m-file
.init
Methode freizugeben und etwas anderes zurückzugeben? Gibt es Codebeispiele von Apple, in denen dies geschieht? (2) Außerdem erstellen Sie vermutlich eine Instanz mit Code wie[[Laugh alloc] initWithLaughter:kLaughWithGiggle]
. Beachten Sie, wieLaugh
unnötig zugewiesen wird, da es sofort nach diesem Aufruf freigegeben wird. Warum so, wenn Sie eine Klassenmethode erstellen können,[Laugh laughWithLaughter:kLaughWithGiggle]
die Ihnen alle Vorteile privater Unterklassen bietet und gleichzeitig die obigen Probleme 1 und 2 vermeidet?+alloc
Gibt im wirklichen Leben eine Singleton-Factory-Klasse zurück, die die verschiedenen-initWith:
Methoden implementiert . Die-initWith:
Methoden der Factory-Klasse sind dann dafür verantwortlich, eine konkrete Unterklasse basierend auf den angegebenen Methodenparametern zuzuweisen und zu initialisieren, falls erforderlich, oder in einigen Fällen überhaupt nichts zuzuweisen (z. B.-[NSString initWithString:]
). Sie können es versuchen , auf den Rückgabewert von Inspektion+[NSString alloc]
,+[NSArray alloc]
usw.Aus der Programmierung in Ziel c von Stephen Kochan auf Seite 498 im Glossar, Cluster:
quelle
Klassencluster bieten eine einzige öffentliche Schnittstelle zu einer Gruppe konkreter, privater Unterklassenimplementierungen. Ein Objective-C-Programmierer verwendet Klassencluster häufig und erkennt dies selten - und das ist der springende Punkt eines Klassenclusters. Die Aufgabe eines Klassenclusters besteht darin, die Komplexität der Implementierungsdetails hinter einer öffentlichen Schnittstelle zu verbergen.
Viele der Foundation-Klassen sind Klassencluster wie NSString, NSArray, NSDictionary und NSNumber. Wenn Sie
[NSString stringWithFormat:]
den Klassencluster aufrufen , erhalten Sie eine konkrete Klasse, die dieNSString
Schnittstelle implementiert . Es könnte eine seinNSConcreteString
,NSCFString
,NSFooBarString
usw. , die die Klasse Cluster gibt Ihnen auf den Konstruktor basiert oder initializer Sie anrufen und die Argumente.Aus diesem Grund sind Klassencluster eines der leistungsfähigsten Konzepte in der Objective-C-Programmierung.
Wenn Sie aus anderen Sprachen kommen, sind Sie möglicherweise mit den Gang of Four-Mustern vertraut. Klassencluster enthalten Elemente sowohl der abstrakten Fabrik als auch der Fassadenmuster.
In der öffentlichen Dokumentation von Apple werden Klassencluster (und deren Implementierung und Erweiterung) ausführlich behandelt. Leider habe ich festgestellt, dass dieses und andere kakaospezifische Muster für viele iOS-Entwickler ein blinder Fleck sind.
Kakaokernkompetenzen: Klassencluster
Kakao-Grundlagenhandbuch: Klassencluster
Beispiele für die Implementierung eigener Klassencluster finden Sie auf GitHub
quelle
Der NSArray-Klassencluster ist kein "Schwergewicht", sondern eine Möglichkeit, eine beliebige Anzahl von Implementierungen einer Array-Klasse zu verwenden, ohne dass Ihr Code die jeweilige Implementierung kennt oder sich darum kümmert. Unter der Haube befinden sich konkrete Unterklassen von NSArray, die für verschiedene Anwendungsfälle geeignet sind, z. B. große, spärliche Arrays oder Arrays mit einer bestimmten Anzahl von Elementen, die zur Kompilierungszeit bekannt sind.
NSArray, NSString und NSNumber sind die Klassencluster, auf die Sie am häufigsten stoßen.
quelle
[myArray isKindOfClass:[NSMutableArray class]]
JA zurückgeben, obwohl dies nicht der Fall sein sollte?