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[]的主要内容,如果未能解决你的问题,请参考以下文章