Question

Je suis en train de sous-classe NSArray, mais il se bloque l'application lorsque vous essayez d'accéder à la méthode de comptage. Je sais que NSArray est groupe classe .

  • Mais qu'est-ce que cela veut dire?
  • Y at-il un travail autour de pouvoir sous-classe NSArray?

Je sais que je peux simplement sous-classe NSObject et que mon tableau comme une variable d'instance, mais je NSArray plutôt sous-classe.

EDIT: Raison: Je crée un jeu de cartes, j'ai un Deck de classe qui devrait sous-classe NSMutableArray d'avoir deux ou trois méthodes supplémentaires (-shuffle, -removeObjects:, -renew, etc.), et je pense qu'il regardera plus propre à la sous-classe NSArray plutôt que d'avoir un var.

Était-ce utile?

La solution

Le problème avec l'ajout d'une catégorie sur cette classe comme est que toutes les instances de la classe héritent des méthodes supplémentaires. C'est à la fois inutile (car tous les besoins du tableau pour pouvoir être brassé, etc.) et dangereux (parce que vous ne pouvez pas bénéficier de la vérification du type pour être sûr que le NSArray vous faites référence actuellement est vraiment celui qui devait être brassé ).

Une alternative serait de créer votre propre classe de plate-forme qui a une NSMutableArray comme une variable d'instance. Là, vous pouvez définir exactement comme des actions sur votre plate-forme que vous souhaitez, et le fait que vous utilisez un NSMutableArray devient un détail de mise en œuvre. Cela vous permet de profiter de la vérification du type à la compilation et il vous permet de modifier l'implémentation interne de votre classe de plate-forme sans changer ses clients. Par exemple, si vous avez décidé, pour une raison qu'un NSMutableDictionary serait un meilleur magasin de sauvegarde, vous pouvez faire tous ces changements dans la mise en œuvre de votre classe de plate-forme sans changer le code qui crée et utilise la plate-forme.

Autres conseils

En général, vous aurez pas besoin de sous-classe, mais en tout cas, les suggestions faites par Apple sont:

  

Toute sous-classe de NSArray doit remplacer les méthodes d'instance primitives count et objectAtIndex:. Ces méthodes doivent fonctionner sur le magasin de soutien que vous fournissez pour les éléments de la collection. Pour ce magasin de support, vous pouvez utiliser un tableau statique, un objet standard NSArray, ou un autre type de données ou d'un mécanisme. Vous pouvez également choisir de remplacer, partiellement ou totalement, toute autre méthode NSArray pour laquelle vous souhaitez fournir une implémentation alternative.

Est-ce réellement outrepasser le countmethod? Comme ils disent que vous devez fournir votre propre structure de support aux éléments du tableau de maintien, et remplacer les méthodes proposées en tenant compte de cette ..

Si vous êtes juste d'ajouter de nouvelles méthodes, et en utilisant le magasin de support existant, une meilleure approche consiste à ajouter une catégorie à NSArray. Les catégories sont une partie très puissante de Objective-C - voir CocoaDev pour certains échantillons

.

NSMutableArray a déjà - (void)removeObjectsInArray:(NSArray *)otherArray; Vous allez mieux loti faire une sous-classe NSObject avec une propriété de tableau mutable.

Dans ce cas particulier, je voudrais la lecture aléatoire tableau à l'aide -sortedArrayUsingComparator: et rendre votre comparateur retour au hasard NSOrderedAscending ou NSOrderedDescending.

par exemple:

NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
    ^(id obj1, id obj2) { 
     return random() %  2 ? NSOrderedAscending : NSOrderedDescending;
     }];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top