xcode -[__NSArrayM objectAtIndex:]: 索引 4294967295 超出了带有 arc4random 的空数组的界限
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8936760/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
-[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds for empty array with arc4random
提问by Desmond
EDIT: i replaced arc4random() to arc4random_uniform() for fix
编辑:我将 arc4random() 替换为 arc4random_uniform() 进行修复
I'm using test flight to monitor crashes. been fixing bugs, however i encounter this bug, i'm not sure why the index is so big.
我正在使用试飞来监控崩溃。一直在修复错误,但是我遇到了这个错误,我不知道为什么索引这么大。
-[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds for empty array
it is likely that this is where the bug is
这很可能是错误所在
for (NSUInteger i = 0; i < count; ++i) {
// Select a random element between i and end of array to swap with.
int nElements = count - i;
int n = (arc4random() % nElements) + i;
[randomName exchangeObjectAtIndex:i withObjectAtIndex:n];
[randomImgName exchangeObjectAtIndex:i withObjectAtIndex:n];
[randomID exchangeObjectAtIndex:i withObjectAtIndex:n];
}
which caused crashes here
这导致这里崩溃
//Frog Name Caption
NSString * tempCaption = [defaultFrogImageCaption objectAtIndex:[defaultFrogImageCaption count]-1];
self.dFrogID = [defaultFrogID objectAtIndex:[defaultFrogID count]-1];
i believe this is the bug, but i do not know how to solve the error.
我相信这是错误,但我不知道如何解决错误。
appreciated all the comment and help
感谢所有的评论和帮助
-(void)defaultFrogSetup
{
self.imageArray = [[NSMutableArray alloc] initWithObjects:
[UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"defaultFrog/d7.jpg"]],
[UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"defaultFrog/d9.jpg"]],
[UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"defaultFrog/d11.jpg"]],
[UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"defaultFrog/d27.jpg"]],
[UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"defaultFrog/d6.jpg"]],
nil];
//self.defaultFrogID = [[NSMutableArray alloc] initWithObjects:@"6",@"8",@"10",@"26",@"5",nil];
self.defaultFrogID = [[NSMutableArray alloc] initWithObjects:@"6",@"8",@"10",@"24",@"5",nil];
self.defaultFrogImageCaption = [[NSMutableArray alloc] initWithObjects:@"Verreaux's Tree Frog",@"Green Tree Frog",@"Red-Eyed Tree Frog",@"Crucifix Frog",@"Eastern Dwarf Tree Frog",nil];
NSUInteger count = [self.defaultFrogID count];
//NSLog(@"Count %i",[self.defaultFrogID count]);
NSMutableArray *randomImgName = self.imageArray;
NSMutableArray *randomID = self.defaultFrogID;
NSMutableArray *randomName = self.defaultFrogImageCaption;
//likely bug here
for (NSUInteger i = 0; i < count; ++i) {
// Select a random element between i and end of array to swap with.
int nElements = count - i;
int n = (arc4random() % nElements) + i;
[randomName exchangeObjectAtIndex:i withObjectAtIndex:n];
[randomImgName exchangeObjectAtIndex:i withObjectAtIndex:n];
[randomID exchangeObjectAtIndex:i withObjectAtIndex:n];
}
self.imageArray = randomImgName;
self.defaultFrogID=randomID;
self.defaultFrogImageCaption=randomName;
//NSLog(@"default filename %@",self.defaultFrogImageCaption);
//NSLog(@"default frog ID %@",self.defaultFrogID);
self.imageViewTop.alpha = 1.0;
self.imageViewBottom.alpha = 0.0;
self.imageViewBottom = [[UIImageView alloc] initWithFrame:CGRectMake(0,44,320,367)];
self.imageViewTop = [[UIImageView alloc] initWithFrame:CGRectMake(0,44,320,367)];
[self.view addSubview:imageViewTop];
[self.view addSubview:imageViewBottom];
self.buttonCaption = [UIButton buttonWithType:UIButtonTypeCustom];
//default placement
self.buttonCaption.frame = CGRectMake(245, 367, 70, 44);
//[buttonCaption setTitle:@"\u00A9" forState:UIControlStateNormal];
[self.buttonCaption addTarget:self action:@selector(buttonCheck) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.buttonCaption];
[self defaultFrogAnimation:buttonCaption.frame.size.width];
}
-(void)defaultFrogAnimation:(float)previousWidth {
defaultFrog = 1;
foundFrog = 0;
//picture loop
imageViewTop.image = imageViewBottom.image;
imageViewBottom.image = [imageArray objectAtIndex:[imageArray count] - 1];
[imageArray insertObject:imageViewBottom.image atIndex:0];
[imageArray removeLastObject];
imageViewTop.alpha = 1.0;
imageViewBottom.alpha = 0.0;
//Frog Name Caption
NSString * tempCaption = [defaultFrogImageCaption objectAtIndex:[defaultFrogImageCaption count]-1];
self.dFrogID = [defaultFrogID objectAtIndex:[defaultFrogID count]-1];
// make the buttons content appear in the top-left
[buttonCaption setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter];
[buttonCaption setContentVerticalAlignment: UIControlContentVerticalAlignmentCenter ];
[defaultFrogImageCaption insertObject:tempCaption atIndex:0];
[defaultFrogImageCaption removeLastObject];
[defaultFrogID insertObject:dFrogID atIndex:0];
[defaultFrogID removeLastObject];
//button setting
[buttonCaption.titleLabel setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[buttonCaption.titleLabel setFont:[UIFont systemFontOfSize:17]];
[buttonCaption setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[[buttonCaption layer] setCornerRadius:5.0f];
[[buttonCaption layer] setMasksToBounds:YES];
[[buttonCaption layer] setBackgroundColor:[[UIColor colorWithRed:255 green:255 blue:255 alpha:1] CGColor]];
[buttonCaption.titleLabel setFrame:CGRectMake(0,9, 25, 25)];
stringsize = [tempCaption sizeWithFont:[UIFont systemFontOfSize:19]];
CGFloat diff = stringsize.width - previousWidth;
//NSLog(@"diff %f",diff);
[UIView animateWithDuration:3
animations:^{
imageViewTop.alpha = 0.0;
imageViewBottom.alpha = 1.0;
}
completion:^(BOOL completed){
if (completed)
[self defaultFrogAnimation:stringsize.width];
}
];
[UIView animateWithDuration:0.1 delay:0 options:0
animations:^{
[buttonCaption setTitle:tempCaption forState:UIControlStateNormal];
NSLog(@"frog Name %@",tempCaption );
NSLog(@"frog ID %@",dFrogID);
}
completion:^(BOOL completed)
{
}];
[UIView animateWithDuration:0.3 delay:0 options:0
animations:^{
[buttonCaption setFrame:CGRectMake(buttonCaption.frame.origin.x-diff,
buttonCaption.frame.origin.y,
buttonCaption.frame.size.width + diff,
buttonCaption.frame.size.height)];
}
completion:^(BOOL completed){
}];
}
回答by schtever
The size of the array is zero. The large number is actually -1 expressed as an unsigned integer. When you evaluate [array count]-1, since the array size is zero, it attempts to access the object at index -1. I suspect that the array defaultFrogId or defaultFrogIdCaption is empty because you didn't specify retain or something when you declared it.
数组的大小为零。大数实际上是 -1 表示为无符号整数。当您计算 [array count]-1 时,由于数组大小为零,它尝试访问索引 -1 处的对象。我怀疑数组 defaultFrogId 或 defaultFrogIdCaption 是空的,因为您在声明它时没有指定保留或其他内容。
回答by Suran
The Way You fixed it is okay. But, it'll work only in iOS 4.3 and above... To fix the issue use abs(arc4random())%mod_factor
instead of arc4random()%mod_factor
. The problem is due to the fact that, arc4random()
returns unsigned integer value.
你修复它的方式没问题。但是,它会工作只有在的iOS 4.3及以上...要解决此问题使用abs(arc4random())%mod_factor
的替代arc4random()%mod_factor
。问题是由于arc4random()
返回无符号整数值这一事实。