Frage

Ich versuche, Unterklasse NSArray, aber es stürzt die App beim Versuch, die Zählmethode zuzugreifen. Ich weiß, dass NSArray ist ein Klasse Cluster .

  • Aber was bedeutet das?
  • Gibt es eine Arbeit um der Lage sein, eine NSArray?
  • Unterklasse

Ich weiß, dass ich einfach Unterklasse NSObject und habe meine Array als Instanzvariable, aber ich möchte lieber Unterklasse NSArray.

EDIT: Grund: Ich bin ein Kartenspiel zu schaffen, ich habe eine Klasse Deck die NSMutableArray Unterklasse sollte ein paar zusätzlicher Methoden haben (-shuffle, -removeObjects:, -renew, etc), und ich denke, es ist saubere Unterklasse NSArray aussehen wird, anstatt eine var mit.

War es hilfreich?

Lösung

Das Problem mit dem Hinzufügen einer Kategorie für eine Klasse wie dieser ist, dass alle Instanzen der Klasse werden die zusätzliche Methoden erben. Das ist sowohl unnötig (da nicht alle Array muss in der Lage sein, gemischt werden, etc.) und gefährlich (denn man kann nicht profitieren von Typprüfung sicher zu sein, die NSArray Sie gerade beziehen, ist wirklich eine, die gemischt werden, wurde erwartet ).

Eine Alternative wäre eine eigene Deck-Klasse zu erstellen, die eine NSMutableArray als Instanzvariable hat. Dort können Sie genau Aktionen auf dem Deck definieren, wie Sie mögen, und die Tatsache, dass Sie eine NSMutableArray verwenden wird eine Implementierung Detail. Auf diese Weise können Sie die Vorteile der Typprüfung bei der Kompilierung-Zeit in Anspruch nehmen und es können Sie die interne Umsetzung Ihrer Deck Klasse ändern, ohne ihre Kunden zu ändern. Zum Beispiel, wenn Sie aus irgendeinem Grund beschlossen, dass ein NSMutableDictionary würde einen besseren Sicherungsspeicher sein, können Sie alle diese Änderungen in der Umsetzung Ihrer Deck Klasse machen, ohne dass der Code zu ändern, die das Deck erstellt und verwendet.

Andere Tipps

Sie werden in der Regel nicht brauchen es zu Unterklasse, aber in jedem Fall, dass die Vorschläge von Apple sind:

Jede Unterklasse von NSArray muss überschreiben die primitiven Instanzmethoden count und objectAtIndex:. Diese Methoden müssen auf dem Zusatzspeicher arbeiten, dass Sie für die Elemente der Kollektion bieten. Für diesen Zusatzspeicher können Sie ein statisches Array verwenden, ein Standard NSArray-Objekt oder einen anderen Datentyp oder einen Mechanismus. Sie können auch außer Kraft setzen wählen, teilweise oder vollständig, andere NSArray Methode, für die Sie eine alternative Implementierung zur Verfügung stellen möchten.

Haben Sie eigentlich countmethod außer Kraft setzen? Wie sie sagen Sie Ihre eigene Trägerstruktur zu halten, Array-Elemente zu bieten haben, und vorgeschlagenen Methoden überschreiben diese ..

Berücksichtigung

Wenn Sie nur neue Methoden hinzufügen, und mit Hilfe der vorhandenen Hintergrundspeicher, dann ein besserer Ansatz ist es, eine Kategorie zu NSArray hinzuzufügen. Kategorien sind ein wirklich starkes Stück Objective-C - siehe CocoaDev für einige Proben

.

NSMutableArray hat bereits eine - (void)removeObjectsInArray:(NSArray *)otherArray; Du wirst am besten sein, aus einer NSObject Unterklasse mit einer änderbaren Array-Eigenschaft zu machen.

In diesem speziellen Fall würde ich das Array mische -sortedArrayUsingComparator: und machen Ihre Komparator zufällig NSOrderedAscending oder NSOrderedDescending zurück.

z:

NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
    ^(id obj1, id obj2) { 
     return random() %  2 ? NSOrderedAscending : NSOrderedDescending;
     }];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top