[英]NSNumbers taking up less memory than ints?
我仍然是一个菜鸟,通过使用XCode组合一些针对OS-X的简单程序,学习了Objective-C的基础知识非常有趣。
我有一个程序,可将五张扑克牌排名。
卡组中的每张卡均由其唯一的“索引号”(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对象。 然后,我可以列出数组中的所有元素。
但是我认为将int封装在这样的NSNumber对象中必须占用更多内存。 也许将索引号存储为short int会更好。
但是,如果不是像上面那样构建我的数组,而是这样做:
`short int allPossibleHands[2598960][5]`;
然后打算使用我的循环直接存储int,我收到一条EXC_BAD_ACCESS错误消息,并注意到该程序没有可用的内存。
那么我怎么能存储所有这些NSNumber对象,而不是ints?
我要打破一些关于数组构造的规则吗?
与往常一样,任何指导都值得赞赏。
谢谢您阅读此篇。
我认为问题在于您存储阵列的位置。 它在堆栈上吗? 如果是这样,请记住它将比大多数堆栈所允许的大25MB。
假设NSNumber对象必须存储数字的值和类型,则它可能比int大一点。
但是,如果您的int [] []数组是局部变量,则很有可能将其存储在堆栈中,并且大多数堆栈不会那么大。 您可以使用指向此类数组的指针,并在堆上对其进行malloc,这可能有足够的空间容纳它。
访问C数组的速度可能要比访问NSArray中的许多NSNumber并提取其值快一点,并且如果这是用于纸牌游戏,则速度可能是个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.