NSNumbers占用的内存少于整数?

时间:2011-07-28 10:53:33

标签: objective-c arrays nsnumber

我还是一个菜鸟,学习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对象,而不是整数?

我有什么关于阵列构造的规则吗?

一如既往,任何指导都非常感激。

感谢您阅读本文。

3 个答案:

答案 0 :(得分:4)

虽然第二个是在堆栈上分配的(其大小更加有限),但第一个在堆上分配,并且是指向内存区域的指针。

这并不意味着第一个占用的空间更少。如果您将第二个数组作为指针分配,则错误将消失。

另请阅读this question的答案。

答案 1 :(得分:1)

我认为问题在于您存储阵列的位置。它在堆栈上吗?如果是这样,请记住它将比大多数堆栈允许的大25MB。

答案 2 :(得分:1)

假设NSNumber对象必须存储值和数字的类型,它可能比int大一点。

但是如果你的int [] []数组是一个局部变量,它很可能存储在堆栈中,并且大多数堆栈都不是那么大。你可以使用指向这样一个数组的指针并在堆上malloc它,它可能有足够的空间。

访问C数组很可能比访问NSArray中的许多NSNumber并提取其值更快一些,如果这是一个纸牌游戏,速度可能是一个问题。