2011-03-29 2 views
6

내 수준에서 int []의 힙을 저장할 필요가 있습니다.NSArray of int []

NSMutableArray에 int []를 저장하고 배열에서 무작위로 가져 오는 것이 좋은 방법이라고 판단했습니다.

[int]는 객체가 아니며 obj-c 배열 안에 추가 할 수 없습니다.

임의의 정수 배열을 얻을 수있는 방법에 대한 제안이있는 사람이 있습니까?

내 배열은 다음과 같습니다

int lvl1[] { 4,80,49,6,40,77,21,20,91,5,100,91,...... }; 
int lvl2[] { 20,260,385,20,290,448,21,210,329,21,...... }; 
int lvl3[] { 441,21,90,364,21,70,385,21,170,434,...... }; 
... 
int lvl50[] { 441,21,90,364,21,70,385,21,170,434,...... }; 

나는 이들의 임의의 하나를 얻을 필요가있다. 의 NSNumber에

답변

9

편집 : 토미의 코멘트 덜 악한 방법 의례를 사용하도록 변경.

당신은 포인터로 정적 배열을 치료하고 NSValue 객체에 저장할 수 있습니다 : 또는

[mutableArray addObject:[NSValue valueWithPointer:lvl1]]; 

... 

int* level = [(NSValue*)[mutableArray objectAtIndex:whatever] pointerValue]; 
int someContainedInt = level[index]; 

, 당신은 자신의 NSData 객체 각각의 배열을 포장하고 변경 가능한 배열의 사람들 저장할 수 :

[mutableArray addObject:[NSData dataWithBytes:lvl1 length:sizeof(int) * lengthOfArray]]; 

... 

const int* level = (const int*) [(NSData*) [mutableArray objectAtIndex:whatever] bytes]; 

프랭크 C와 동의해야합니다. 왜 이러한 배열을 저장하기 위해 코코아 배열을 사용해야합니까? 전체 C 배열을 2D C 배열로 취급 할 수 없습니까? 어쨌든 정적 데이터 인 경우 NSMutableArray의 동적 측면은 거의 불필요한 것처럼 보입니다.

static int levels[][LEVEL_SIZE] = 
{ 
    {1, 2, 3, 4, ...}, 
    {15, 17, 19, 21, ...}, 
    {8, 7, 6, 5, ...} 
}; 

그렇지 않으면 :

편집 2 : - - LEVEL_SIZE을 호출이 같은 직선 2 차원 배열을 구축 할 수있는 수준의 배열은 모두 같은 길이 인 경우 사용하여 C 배열

각각의 배열을 따로 만들고 나서 묶어야합니다.

static int level1[] = {1, 2, 3, 4, ...}; 
static int level2[] = {15, 17, 19, 21, ...}; 
static int level3[] = {8, 7, 6, 5, ...}; 
... 
static int* levels[] = {lvl1, lvl2, lvl3, ...}; 

어느 쪽이든, 어느 쪽이든 u는 포인터로 한 단계 뽑아 수 있습니다

int* level = levels[0]; 
printf("%d\n", level[1]); // should print 2 

이 시작하는 당신이 NUM_LEVELS 수준이있을 것이다 - 귀하의 경우 50 - 그래서 스틱 당신의 가변 배열에 많은 인덱스 0..49, 등 NSNumber 제품 :

NSMutableArray* levelIndices = [NSMutableArray arrayWithCapacity:NUM_LEVELS]; 
for (int i = 0; i < NUM_LEVELS; ++i) 
    [levelIndices addObject:[NSNumber numberWithInt:i]]; 

사용하여 계산이 배열, 점점 요구를 제거.

int* level = levels[[someNSNumber intValue]]; 

잇 짜잔 : 당신이 NSNumber 객체를 꺼내 때, 수준을 얻을 수있는 수준의 배열에 인덱스를 사용합니다.

+1

NSValue + valueWithPointer : 및 [instanceOfNSValue pointerValue]를 통해 객체에 포인터를 저장할 수 있으므로 포인터와 정수의 상대 크기에 대한 가정을 할 필요가 없습니다. 그러나 포스터는 개체의 비용이 개체가 아닌 개체가되기를 원합니다. – Tommy

+0

필자는 반드시 NSMutableArray를 사용할 필요가 없다. 단지 count, objectatindex, add/remove의 쉬운 API를 가지고있다. –

+0

@Tommy 그 점을 지적 해 주셔서 감사 드리며 그에 따라 답변을 업데이트했습니다. – walkytalky

2

박스 그것을 :

[array addObject:[NSNumber numberWithInt:5]]; 
+0

나는 이것에 대해 생각했지만 문자 그대로 자동으로 생성 된 수천 개의 정수를 가질 것이다. 이것은 매우 지저분한 해결책이 될 것입니다. 또한 도움이된다면 정적입니다. –

+0

이렇게 해보십시오 : http://www.cocoabyss.com/foundation/collections-integers-performance/ – Nyx0uf

+0

죄송합니다. 그러나 이것은 도움이되지 않습니다. INT lvl1 [] {4,8049640772120915100,91, ...} INT lvl2 [] {2026038520290,448 : 내 배열은 다음과 같습니다 , 21,210,329,21, ...} INT lvl3 [] {441,21,90364217038521170,434, ...} 내가 이들 –

8

사용 NSNumber가있는 NSMutableArray에 INT 저장합니다.

// Add 
[yourMutableArray addObject:[NSNumber numberWithInt:yourInt]]; 

// Get 
yourInt = [((NSNumber*)[yourMutableArray objectAtIndex:0]) intValue]; 
4

크레이그,

오브젝티브 C로

는 C를 기반으로하고 혼용 모두 iOS 또는 OSX 응용 프로그램에서 왜 그냥 int 배열을 만들 수 있습니다

여기에 샘플 코드입니까?

이렇게하면 모든 것을 NSNumber로 변환하지 않고도 성능을 향상시키고 메모리를 줄일 수 있습니다.

프랭크

+0

Objective-C가 C를 잊어 버리지 않은 경우 +1! – Taum

+0

int []를 사용하고 있습니다. 나는 불필요하게 NSNumbers와 같은 다중 변환자를 사용하는 것을 피하려고 노력하고있다. 고마워요, 어쨌든 :) –

+0

@Craig NSNumber를 사용하는 것은 아닙니다. 사실 그 반대입니다. int []는 자체적으로 잘 작동합니다. –