Je lisais que NSArray est une telle chose. Cela semble lourd. J'ai 7 livres vraiment gros sur mon bureau sur Objective-C, Cocoa et C. Aucun d'eux ne mentionne le cluster de classes du tout, du moins je ne le trouve pas dans l'index à la fin des livres. Alors qu'est-ce que c'est?
91
Réponses:
A partir de docs d'Apple ... . En bref, c'est un modèle de conception utilisé dans le framework Foundation, ce qui explique probablement pourquoi il n'est pas mentionné dans les livres ObjC.
la source
Je ne sais pas ce qu'il y a dans le CDP auquel Steve a fait référence, mais fondamentalement, le cluster de classes Objective-C est une construction qui prend en charge l'implémentation du modèle abstrait Factory .
L' idée est simple : vous souhaitez fournir une interface Factory (Cluster) qui, avec une description minimale, fabrique et renvoie une instance concrète spécifique d'un objet Factory qui satisfait le comportement de la famille de clusters décrite par l'interface Factory (Cluster).
Un exemple concret simple : Cet exemple fournit une usine de rire qui produit des classes concrètes de types de rire spécifiques (par exemple Guffaw, Giggle). Faites attention à la méthode Laugh initWithLaughter:.
Dans Laugh.h:
Dans Laugh.m:
la source
.m-file
.init
méthode et de retourner quelque chose d'autre? Y a-t-il des exemples de code d'Apple où ils font cela? (2) En outre, vous créez probablement une instance avec un code tel que[[Laugh alloc] initWithLaughter:kLaughWithGiggle]
. Remarquez commentLaugh
est alloué inutilement, car il sera libéré immédiatement après cet appel. Pourquoi faire de cette façon quand vous pouvez créer une méthode de classe telle que celle[Laugh laughWithLaughter:kLaughWithGiggle]
qui vous donne tous les avantages des sous-classes privées, tout en évitant les problèmes 1 et 2 ci-dessus?+alloc
renvoie une classe d'usine singleton qui implémente les différentes-initWith:
méthodes. Les-initWith:
méthodes de la classe d'usine sont alors responsables de l'allocation et de l'initialisation d'une sous-classe concrète basée sur les paramètres de méthode donnés, si nécessaire, ou dans certains cas, peuvent ne rien allouer du tout (comme-[NSString initWithString:]
). Vous pouvez l' essayer en examinant à la valeur de retour+[NSString alloc]
,+[NSArray alloc]
etc.De la programmation en objectif c par Stephen Kochan à la page 498 du glossaire, cluster:
la source
Les clusters de classes fournissent une interface publique unique à un groupe d'implémentations de sous-classes privées et concrètes. Un programmeur objective-c utilise souvent des clusters de classes et s'en rend rarement compte - et c'est tout l'intérêt d'un cluster de classes. Le travail d'un cluster de classes est de cacher la complexité des détails d'implémentation derrière une interface publique.
La plupart des classes Foundation sont des clusters de classes, tels que NSString, NSArray, NSDictionary et NSNumber. Lorsque vous appelez
[NSString stringWithFormat:]
le cluster de classes, cela vous donne une classe concrète qui implémente l'NSString
interface. Il pourrait être unNSConcreteString
,NSCFString
,NSFooBarString
, etc. Ce qui le cluster de classe vous donne est basé sur le constructeur ou initialiseur vous appelez et les arguments.Pour cette raison, les clusters de classes sont l'un des concepts les plus puissants de la programmation Objective-C.
Si vous venez d'autres langues, vous connaissez peut-être les modèles Gang of Four. Les clusters de classes ont des éléments à la fois de l'usine abstraite et des motifs de façade.
La documentation publique d'Apple couvre assez largement les clusters de classes (et comment les implémenter et les étendre). Malheureusement, j'ai trouvé que pour de nombreux développeurs iOS, cela et d'autres modèles spécifiques à Cocoa sont un angle mort.
Compétences principales de Cocoa: cluster de classes
Guide des fondamentaux du cacao: Clusters de classes
Des exemples d'implémentation de vos propres clusters de classes sont disponibles sur GitHub
la source
Le cluster de classes NSArray n'est pas "lourd", c'est un moyen pour n'importe quel nombre d'implémentations d'une classe de tableau à utiliser sans que votre code connaisse ou se soucie de l'implémentation particulière. Sous le capot, il existe des sous-classes concrètes de NSArray qui conviennent à différents cas d'utilisation, tels que des tableaux volumineux et épars ou des tableaux contenant un nombre spécifique d'éléments connus au moment de la compilation.
NSArray, NSString et NSNumber sont les clusters de classes que vous rencontrerez le plus souvent.
la source
[myArray isKindOfClass:[NSMutableArray class]]
renverrait pas YES même si ce n'est pas le cas?