本文介绍了-[__ NSArrayM objectAtIndex:]:索引4294967295超出了arc4random空数组的范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑:我将arc4random()替换为arc4random_uniform()进行修复

i replaced arc4random() to arc4random_uniform() for fix

我正在使用测试飞行来监控崩溃。
正在修复错误,但是我遇到了这个错误,我不确定为什么索引这么大。

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

的范围错误是

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];
    }

这导致此处发生了崩溃

//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.

感谢所有评论和帮助

-(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){
                     }];
}


推荐答案

数组的大小为零。大数实际上是-1,表示为无符号整数。当您评估[array count] -1时,由于数组大小为零,它将尝试访问索引为-1的对象。我怀疑数组defaultFrogId或defaultFrogIdCaption为空,因为声明时未指定保留或其他内容。

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.

这篇关于-[__ NSArrayM objectAtIndex:]:索引4294967295超出了arc4random空数组的范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 13:33