NSArray int[]

Posted

技术标签:

【中文标题】NSArray int[]【英文标题】:NSArray of int[] 【发布时间】:2011-07-25 02:27:06 【问题描述】:

我需要为我的关卡存储一堆 int[]。

我认为将 int[] 存储在 NSMutableArray 中并从数组中随机获取一个将是一个好方法。

问题是,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,...... ; 

然后我需要随机选择其中一个。

【问题讨论】:

【参考方案1】:

编辑:根据 Tommy 的评论改为使用不那么邪恶的方法。

您可以将静态数组视为指针并将它们存储在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];

不过,我必须同意 Frank C 的观点——为什么需要使用 Cocoa 数组来存储这些数组?你不能把所有的东西都当作一个 2D C 数组吗?如果它是静态数据,那么NSMutableArray 的动态方面似乎是多余的。

编辑 2:使用 C 数组

如果你的关卡数组的长度都相同——称之为LEVEL_SIZE——你可以像这样构建一个直接的二维数组:

static int levels[][LEVEL_SIZE] = 

    1, 2, 3, 4, ...,
    15, 17, 19, 21, ...,
    8, 7, 6, 5, ...
;

否则,您需要分别构建每个数组,然后再将它们组合在一起:

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, ...;

无论哪种方式,你都可以拔出一层作为指针:

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

使用此数组来计算、获取和删除需求。当您拉出一个NSNumber 对象时,使用它来索引levels 数组以获取级别:

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

等等。

【讨论】:

您可以通过NSValue +valueWithPointer: 和[instanceOfNSValue pointerValue] 将指针存储在对象中,无需对指针和整数的相对大小做任何假设。但我认为张贴者希望各个数字成为对象,而你知道,它们是对象的成本。 我不一定要用 NSMutableArray,只是他们有一个简单的计数、objectatindex 和添加/删除 API。 @Tommy 感谢您指出这一点,我已经相应地更新了答案。 @Craig OK,但是你可以只在 NSMutableArray 中保留关卡索引(包装为 NSNumber)。 感谢你们的帮助,所以.. 我该怎么做?我的关卡编辑器生成了一个数字列表,然后随机获取这些列表中的一个。你会怎么做?此外,这些数字列表是静态的,除非重新编译,否则不需要更改。【参考方案2】:

使用NSNumber 将 int 存储在 NSMutableArray 中。

这里是示例代码:

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

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

【讨论】:

【参考方案3】:

克雷格,

由于 Objective-C 基于 C,您可以在 ios 或 OSX 应用程序中混合使用,为什么不直接创建一个整数数组?

与将所有内容转换为 NSNumber 相比,这将为您提供规模和减少内存的性能。

弗兰克

【讨论】:

我使用的是 int[]。我试图避免不必要地使用 NSNumbers 等的多次转换。无论如何谢谢:) @Craig 我不建议使用 NSNumber,事实上恰恰相反。 int[] 本身就可以正常工作。【参考方案4】:

把它装进一个 NSNumber :

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

【讨论】:

我想过这个问题,但实际上我会自动生成数千个整数。这将是一个非常混乱的解决方案。此外,如果有帮助,它们是静态的。 所以试试这个:cocoabyss.com/foundation/collections-integers-performance 对不起,但这没有帮助。我的数组如下所示: 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,...... 然后我需要随机获得一个 一般来说,这是正确的答案。在大多数其他语言中,装箱和拆箱是自动完成的,因此您在代码中看不到它,但绝对可以忽略不计的性能影响仍然存在。 @Benj 您提供的链接显示它比使用直接 C 慢 10 倍。是的。尽管如此,这仍是过早的优化。

以上是关于NSArray int[]的主要内容,如果未能解决你的问题,请参考以下文章

OC基础 NSArray 容器

NSArray使用小结

Foundation 之 NSArray/NSMutableArrray

36-oc NSArray

如何从自定义类中检索 NSArray

NSSortDescriptor 不排序 NSArray