2009-06-24 16 views
1

In anderen Sprachen konnte ich eine Klasse erstellen und dann verwenden, um ein Array von Objekten in dieser Klasse zu erstellen, zB Klassenpreis, der in einer Leistungsklasse verwendet wird, um einen Preis zu definieren;Ziel C Erstellen von benutzerdefinierten Arrays

in Ziel C Ich kann das nicht zur Arbeit, wie machst du es?

Die Preisklasse ist eine Vererbung von NSObject, kann ich NSMutableArray verwenden?

+0

Ich bin nicht ganz sicher, was Sie fragen ... können Sie umformulieren? Willst du sagen, dass du ein Array von Instanzen der Preisklasse haben willst, oder ein NSArray, das ein Ivar der Preisklasse ist ... oder etwas anderes? Was genau versuchen Sie zu erreichen, dass Sie nicht können? – Walker

+0

Und Sie sagen, Sie können ein "benutzerdefiniertes Array" erstellen? in anderen Sprachen. Wie in C? Wenn es C/C++ ist, könntest du mir ein Beispiel dafür geben, wie du es dort machen würdest und wie du deine Frage klären würdest, denn ich weiß nicht genau, was du fragst. – Walker

Antwort

1

Ja, NSMutableArray ist, was Sie verwenden möchten.

1

Um Ihre letzte Frage zuerst zu beantworten: Wenn Sie Instanzen von Objective-C-Objekt speichern (das, wie Sie sagen, erben von NSObject) dann ja, verwenden Sie NSMutableArray. Dies funktioniert jedoch nicht für primitive Typen (wie int, BOOL, char, char* usw.).

Objective-C verwendet die C-Methode zum Deklarieren von Arrays mit einem Vorbehalt: Sie können keinen Speicher auf dem Stack zuweisen (was in C der Fall ist), nur auf dem Heap. Das bedeutet, dass Sie malloc (bevorzugen Sie NSAllocateCollectable() auf Leopard oder später) und free verwenden müssen, um den Speicher zu verwalten. Außerdem deklarieren Sie das Array als einen Zeiger auf ein Array oder Zeiger. Etwas wie folgt aus: (Anmerkung:. Aus der Luft gezogen wird, nicht getestet)

Price **prices = malloc(numberOfEntries * sizeof(Price*)); 
... 
free(prices); 

eine NSMutableArray Verwendung ist in der Regel viel einfacher, als Sie Ihre eigenen Arrays zu verwalten. Beachten Sie nur die Speicherverwaltungsregeln: Sammlungen rufen -retain auf einem Objekt auf, wenn es eingefügt wird, und -release darauf, wenn es entfernt wird (oder auf alle Objekte, wenn die Sammlung aufgehoben wird).

2

Wenn Sie eine Klasse Price haben und diese von NSObject erbt, können Sie ein Array von ihnen in einem NSArray oder NSMutableArray speichern. Sie könnten sie auch in einem C-Array oder einem STL-Vektor speichern, obwohl die Speicherverwaltungsse- matik in diesen Fällen schwierig sein kann. Im Falle eines NSArray/NSMutableArray übernimmt das Array eine Eigentumsreferenz für das Objekt, sodass Sie es nach dem Hinzufügen zum Array freigeben können, und es verbleibt im Speicher, bis es aus dem Array entfernt wird (und.) alle anderen Standorte).

-Code könnte wie folgt aussehen:

NSMutableArray* a = [NSMutableArray array]; 
[a addObject:[Price price]]; 
// and/or 
[a addObject:[[[Price alloc] init] autorelease]; 
// and/or 
Price* p = [[Price alloc] init]; 
[a addObject:p]; 
[p release]; 
NSLog(@"The array is %@", a); 
// Remember at this point you do not "own" a, retain it if you want to keep it, or use [NSMutableArray new] above 

Wenn ein freigegeben wird, alle Preise enthaltenen Objekte veröffentlicht werden (und möglicherweise ausgeplant).

Verwandte Themen