Objective c NSN数字占用的内存比ints少?

Objective c NSN数字占用的内存比ints少?,objective-c,arrays,nsnumber,Objective C,Arrays,Nsnumber,我仍然是一个不学无术的人,学习Objective-C的基础知识非常有趣,使用XCode为OS-X编写了一些简单的程序 我有一个程序,对五张牌的牌手进行排名 卡片组中的每张卡片都由其唯一的“索引号”(0-51)标识 为了加快evaluator的速度,我认为使用一个包含五个索引的所有可能组合的数组(其中有2598960个)会很有用 如果我这样做: NSMutableArray *allPossibleHands = [[NSMutableArray alloc] initWithObject

我仍然是一个不学无术的人,学习Objective-C的基础知识非常有趣,使用XCode为OS-X编写了一些简单的程序

我有一个程序,对五张牌的牌手进行排名

卡片组中的每张卡片都由其唯一的“索引号”(0-51)标识

为了加快evaluator的速度,我认为使用一个包含五个索引的所有可能组合的数组(其中有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]
`short int allPossibleHands[2598960][5]`;
然后打算使用我的循环直接存储int,我得到一条EXC_BAD_ACCESS错误消息,并注意到程序没有可用的内存

那么,为什么我可以存储所有这些NSNumber对象,但不能存储INT

关于数组构造,我有没有违反一些规则

一如既往,我们非常感谢任何指导


谢谢你阅读这篇文章

第二个在堆栈上分配(其大小限制更大),而第一个在堆上分配,是指向内存区域的指针

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


另外,请阅读的答案。

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

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

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


访问C数组很可能比访问NSArray中的那么多NSNumber并提取它们的值快一点,如果这是用于纸牌游戏,速度可能是个问题。

谢谢。是的,听起来像是堆栈溢出:-)谢谢你的帮助。谢谢你的帮助。非常感谢。当我们开始谈论堆和堆栈时,我完全是个傻瓜,但我确信C数组将是一种更快的处理方法。(我正在努力开发股票计算器,这将涉及到大量交易,越快越好。)你的回答给了我一些有用的东西,让我下一步看看。再次感谢。把它放在堆上看起来是个不错的选择。对于NSNumber对象的二维数组,我每秒评估的手数不到100万只。(我应该补充一点,是其他人编写了评估代码。我正在研究最好的方法来帮助它。)在将所有内容粘贴到一个1-d int数组中之后,我每秒大约获得400万。很不错的。再次感谢你们,感谢所有回答的人,尤其是我看到这是一个有点常见的问题。我在这里学到了一些非常有用的东西。谢谢你的链接。非常有帮助。@Sam Pollard:别忘了把答案标为正确,在你所有的问题上,你应该把最好的答案标出来。