22 Stimmen

NSArray zu C-Array

Können wir NSArray in C-Array konvertieren. wenn nicht, welche Alternativen gibt es. [nehmen wir an, ich muss das C-Array in Opengl-Funktionen füttern, wo das C-Array Vertex-Zeiger aus Plist-Dateien gelesen enthält]

41voto

Will Harris Punkte 21437

Die Antwort hängt von der Art des C-Arrays ab.

Wenn Sie ein Array mit primitiven Werten und bekannter Länge auffüllen müssen, könnten Sie etwa so vorgehen:

NSArray* nsArray = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],
                                             [NSNumber numberWithInt:2],
                                             nil];
int cArray[2];

// Fill C-array with ints
int count = [nsArray count];

for (int i = 0; i < count; ++i) {
    cArray[i] = [[nsArray objectAtIndex:i] intValue];
}

// Do stuff with the C-array
NSLog(@"%d %d", cArray[0], cArray[1]);

Hier ist ein Beispiel, in dem wir ein neues C-Array aus einem NSArray und behält die Array-Elemente als Obj-C-Objekte bei:

NSArray* nsArray = [NSArray arrayWithObjects:@"First", @"Second", nil];

// Make a C-array
int count = [nsArray count];
NSString** cArray = malloc(sizeof(NSString*) * count);

for (int i = 0; i < count; ++i) {
    cArray[i] = [nsArray objectAtIndex:i];
    [cArray[i] retain];    // C-arrays don't automatically retain contents
}

// Do stuff with the C-array
for (int i = 0; i < count; ++i) {
    NSLog(cArray[i]);
}

// Free the C-array's memory
for (int i = 0; i < count; ++i) {
    [cArray[i] release];
}
free(cArray);

Oder, Sie möchten vielleicht nil -Array abschließen, anstatt seine Länge weiterzugeben:

// Make a nil-terminated C-array
int count = [nsArray count];
NSString** cArray = malloc(sizeof(NSString*) * (count + 1));

for (int i = 0; i < count; ++i) {
    cArray[i] = [nsArray objectAtIndex:i];
    [cArray[i] retain];    // C-arrays don't automatically retain contents
}

cArray[count] = nil;

// Do stuff with the C-array
for (NSString** item = cArray; *item; ++item) {
    NSLog(*item);
}

// Free the C-array's memory
for (NSString** item = cArray; *item; ++item) {
    [*item release];
}
free(cArray);

6voto

Ashley Clark Punkte 8783

NSArray hat eine -getObjects:range: Methode zur Erstellung eines C-Arrays für einen Teilbereich eines Arrays.

Exemple :

NSArray *someArray = /* .... */;
NSRange copyRange = NSMakeRange(0, [someArray count]);
id *cArray = malloc(sizeof(id *) * copyRange.length);

[someArray getObjects:cArray range:copyRange];

/* use cArray somewhere */

free(cArray);

5voto

mouviciel Punkte 64583

Ich würde vorschlagen, sich selbst zu konvertieren, mit etwas wie:

NSArray * myArray;

... // code feeding myArray

id table[ [myArray count] ];

int i = 0;
for (id item in myArray)
{
    table[i++] = item;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X