我还是一个菜鸟,学习Objective-C的基础知识很有趣,使用XCode为OS-X编写一些简单的程序。
我有一个对五张牌扑克牌进行排名的程序。
套牌中的每张牌都由其唯一的“索引号”(0-51)
标识为了加快评估者的速度,我认为有一个包含五个索引的所有可能组合的数组是有用的(其中有2598960个)。
如果我这样做:
NSMutableArray *allPossibleHands = [[NSMutableArray alloc] initWithObjects: nil];
for(int i = 0; i<48; i++)
{
for(int j = i+1; j<49; j++)
{
for(int k = j+1; k<50; k++)
{
for(int m = k+1; m<51; m++)
{
for(int n = m+1; n<52; n++)
{
NSNumber *number0 = [NSNumber numberWithInt: i];
NSNumber *number1 = [NSNumber numberWithInt: j];
NSNumber *number2 = [NSNumber numberWithInt: k];
NSNumber *number3 = [NSNumber numberWithInt: m];
NSNumber *number4 = [NSNumber numberWithInt: n];
NSArray *nextCombination = [[NSArray alloc] initWithObjects: number0,number1,number2,number3,number4,nil];
[allPossibleHands addObject: nextCombination];
}
}
}
}
}
NSLog(@"finished building allPossibleHands. It contains %i objects", [allPossibleHands count]
);
一切似乎都运行正常,我得到一条消息,说我的数组包含了预期的2598960个对象。然后我可以列出我的数组的所有元素。
但我认为在NSNumber对象中包装我的内容必须占用更多内存。也许将索引号存储为短整数会更好。
但是,如果不是像上面那样构建我的数组,我会这样做:
`short int allPossibleHands[2598960][5]`;
打算然后使用我的循环直接存储整数,我收到一条EXC_BAD_ACCESS错误消息,并注意到该程序没有可用的内存。
那我怎么能存储所有那些NSNumber对象,而不是整数?
我有什么关于阵列构造的规则吗?
一如既往,任何指导都非常感激。
感谢您阅读本文。
答案 0 :(得分:4)
虽然第二个是在堆栈上分配的(其大小更加有限),但第一个在堆上分配,并且是指向内存区域的指针。
这并不意味着第一个占用的空间更少。如果您将第二个数组作为指针分配,则错误将消失。
另请阅读this question的答案。
答案 1 :(得分:1)
我认为问题在于您存储阵列的位置。它在堆栈上吗?如果是这样,请记住它将比大多数堆栈允许的大25MB。
答案 2 :(得分:1)
假设NSNumber对象必须存储值和数字的类型,它可能比int大一点。
但是如果你的int [] []数组是一个局部变量,它很可能存储在堆栈中,并且大多数堆栈都不是那么大。你可以使用指向这样一个数组的指针并在堆上malloc它,它可能有足够的空间。
访问C数组很可能比访问NSArray中的许多NSNumber并提取其值更快一些,如果这是一个纸牌游戏,速度可能是一个问题。