2009-06-18 4 views
18

NSArray를 C 배열로 변환 할 수 있습니까? . 대안이 존재하지 어떤 경우에 [내가 C 배열이 PLIST 파일에서 읽어 정점 포인터를 포함 OpenGL은 기능의 C 배열을 공급해야하는 가정]NSArray를 C 배열

답변

37

대답은 C- 배열의 특성에 따라 다릅니다. ,

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]); 

여기 우리가 NSArray에서 새 C-배열을 만들려면 예를 들어 : 당신은 원시 값 및 알려진 길이의 배열을 채울 필요가 있다면

, 당신이 뭔가를 할 수 있습니다

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); 

를 또는, nil로 할 수 있습니다 -terminate 배열 대신 주위의 길이를 통과 :의 Obj-C 객체로 배열 항목을 유지

// 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); 
+2

이것은 좋은 대답, 내가가 한 번 이상 투표 할 수 있었으면 좋겠어. 나는'NSString **'타입의 사용이 약간 난독 화된다는 한 가지 제안을했습니다. 나는'[NSData initWithBytesNoCopy : length : freeWhenDone :]'을 사용하여 malloc이 반환하는 포인터와 배열의 크기를 제안한다. – alfwatt

+0

malloc을 사용하는 두 번째 방법을 시도했지만 아크가 비활성화되어야한다고 생각합니다. 적어도, 그것이 내가 일하는 방법입니다. 아마이 질문을했을 때 호가 존재하지 않았다 .... –

4
내가 좋아하는 뭔가 자신을 변환하는 제안

:

NSArray * myArray; 

... // code feeding myArray 

id table[ [myArray count] ]; 

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

NSArray은 배열의 하위 범위에 대해 C- 배열을 만드는 방법을 가지고 있습니다.

예 :

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); 
+0

그래도 NSNumber 개체를 원시 숫자 형식으로 변환하지 않습니다. 질문자는 C 배열을 OpenGL과 함께 사용하기 위해 변환이 필요합니다. 그 때문에 NSNumbers를 넣지 않고도 C 배열을 완전히 채울 수 있습니다. –

+0

아! 문제에 대한 OpenGL 요구 사항을 보지 못했습니다. 이 경우 네, 배열을 수동으로 반복하는 것이 적절할 것입니다. –