[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]

Posted

技术标签:

【中文标题】[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]【英文标题】: 【发布时间】:2014-10-22 21:38:41 【问题描述】:

我是一名新的 ios 开发人员;我有一个带有解析和动态单元格的应用程序,但是当我运行该应用程序时,我发现该应用程序由于标题上的原因而崩溃,我的代码如下

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view

    
    myArray = [[NSMutableArray alloc] init];
    
    
    //create new view if no view is available for recycling
    
   // view = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 250.0f, 300.0f)] autorelease];
    
    FXImageView *imageView = [[[FXImageView alloc] initWithFrame:CGRectMake(0, 0, 250.0f, 350.0f)] autorelease];
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.asynchronous = YES;
   // imageView.reflectionScale = 0.5f;
   // imageView.reflectionAlpha = 0.25f;
  //  imageView.reflectionGap = 10.0f;
    imageView.shadowOffset = CGSizeMake(0.0f, 2.0f);
    imageView.shadowBlur = 5.0f;
    imageView.cornerRadius = 10.0f;
    view = imageView;
    
    [ProgressHUD dismiss];
    
     NSString *string1 = [[NSUserDefaults standardUserDefaults] stringForKey:@"Class"];
    
    PFQuery *query = [PFQuery queryWithClassName:[NSString stringWithFormat:@"%@",string1]];
    
    
    query.cachePolicy = kPFCachePolicyNetworkElseCache;
    
    //show loader view
    
    
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) 
        if (!error) 
            
            myArray = [[NSMutableArray alloc] initWithArray:objects];
            
            PFObject *object = [myArray objectAtIndex:index];
            
            
            [file getDataInBackgroundWithBlock:^(NSData *data1, NSError *error) 
                if (!error) 
                    
                    ((UIImageView *)view).image = [UIImage imageWithData:data1];
                    
                    //[HUD hideUIBlockingIndicator];
                    
                
            ];
            
        
        
    ];

    return view;

    

我将用于第一个屏幕的 UICollectionView 解析为以下代码的动态数据

pragma collectionView 委托

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"cell";
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
    
    CALayer *layer = cell.layer;
    [layer setCornerRadius:8.0f];
    [layer setMasksToBounds:YES];
   // [layer setBorderWidth:1.0f];
  //  layer.backgroundColor = [UIColor whiteColor].CGColor;
    //can you click
    
    PFObject *imageObject = [myArray objectAtIndex:indexPath.item];
    PFFile *imageFile = [imageObject objectForKey:@"image"];
    NSString *name = [imageObject objectForKey:@"name"];
    
    [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) 
        if (!error) 
            
            UIImageView *imageView = (UIImageView *)[cell viewWithTag:100];
            imageView.image = [UIImage imageWithData:data];
            
            UILabel *title2 = (UILabel *)[cell viewWithTag:200];
            title2.text = [NSString stringWithFormat:@"%@",name];
            title2.font = [UIFont fontWithName:@"GESSTextMedium-Medium" size:12];
        
    ];

    
    return cell;

我需要一些帮助才能知道错误在哪里; 每次我在控制台上收到此错误

【问题讨论】:

【参考方案1】:

没有足够的信息。我们甚至不知道这次崩溃的确切路线。 myArray 中的实际对象数量是多少? 您在collectionView:numberOfItemsInSection: 上返回的内容 等等..

恕我直言,最简单的解决方案是调试此崩溃。并找出为什么索引大于预期的objectAtIndex:。试试这个:

1) 打开“断点导航器”

2) 点击“+”按钮并选择“添加异常断点”选项

现在应用程序将在调试时对任何异常使用此断点。

【讨论】:

我已经做到了,我在该行收到断点PFObject *object = [myArray objectAtIndex:index]; 您的carousel:viewForItemAtIndex:reusingView: 方法接收到您在findObjectsInBackgroundWithBlock 中使用的索引,这是错误的。此时您的阵列应该已经可用。你不能确定findObjectsInBackgroundWithBlock 是否能找到足够的物品 为我工作!谢谢!!:]【参考方案2】:

问候和欢迎,新开发者。您要找出的第一件事是发生异常的位置。为此,您需要打开“异常断点”。

执行此操作的确切方式因 Xcode 版本而异(感谢 Apple)。假设您使用的是 Xcode 6,有一个 video here 对此进行了解释。

我认为您的轮播很可能漏报了它拥有的项目数量。或者由于某些其他原因,您试图获取一个不存在的轮播项目......也许轮播在使用现有范围之外的单元格索引进行查询时需要 nil,但您假设该索引是有效的并遇到数组边界异常。粗略猜测,错误可能出在以下几行:

…
myArray = [[NSMutableArray alloc] initWithArray:objects];
PFObject *object = [myArray objectAtIndex:index];
…

我猜section 不是myArray 的有效索引。

(顺便说一句——myArrayobjects 数组的可变副本。你为什么要这样做?你没有对myArray 进行任何更改,所以似乎没有必要。)


您的集合视图委托中可能有一个方法collectionView: numberOfItemsInSection:。或者,如果你不这样做,你可能需要一个。目前里面的代码是什么?

【讨论】:

我将其加入数组,其中包含来自解析的数据;我也使用断点,并提到这一行的错误PFObject *object = [myArray objectAtIndex:index]; 我相信你的话。你这里有问题。您拥有的轮播项目数量取决于您的后台查询结果findObjectsInBackgroundWithBlock:。您的委托/数据源代码必须有某种机制来向轮播解释这一点,但您目前没有。 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section return [myArray count]; 【参考方案3】:

您的问题出在这一行:PFObject *object = [myArray objectAtIndex:index];

您的索引为 2,但您的数组中只有 2 个对象。由于数组的最大索引是 1 (0..1),它会崩溃。我建议查看调用该方法的位置以及如何获取超出范围的索引。

【讨论】:

是的;你是完全正确的,因为当我使用断点时,它标记了这一行,我使用 po 方法,当我将索引设置为 2 时,它被读取为空;但我不知道如何解决问题;当我将索引设置为 1 时,它运行良好,但我在 caresoul 上得到了相同的项目【参考方案4】:

可能是这两行之一:

PFObject *object = [myArray objectAtIndex:index];

PFObject *imageObject = [myArray objectAtIndex:indexPath.item];

问题在于 index(或第二种情况下的 indexPath.item)包含值 2,而 myArray 的大小为 2(因此唯一有效的索引是 0 和 1)。

【讨论】:

没有;第一行的问题,因为当我使用断点时它会在该行上标记,但我不知道如何解决 你指的是哪一行?我提到的第一个还是您的第一个功能? PFObject *object = [myArray objectAtIndex:index]; 好的。所以现在在上面添加这行代码NSLog(@"%i %i", index, myArray.count);。您会看到您正在尝试访问索引 2,但数组的计数为 2。您的问题是您应该只在 index 时调用此函数 【参考方案5】:

我终于找到了问题所在;我必须为 iCarousel numberOfItems 定义数组,所以代码如下

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel

    //return the total number of items in the carousel

    return ([myArray count]);
    return ([titleArray count]);
    return ([priceArray count]);
    return ([sapArray count]);    

所以我摆脱了索引问题

感谢大家与我分享

【讨论】:

【参考方案6】:

请检查您使用的 numberOfRowsInSection 方法和数组计数。

【讨论】:

以上是关于[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]的主要内容,如果未能解决你的问题,请参考以下文章

[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]'

NSRangeException',原因:'*** -[__NSArrayM objectAtIndex:]:空数组的索引 5 超出范围'

-[__NSArrayM objectAtIndex:]: 索引 11 超出界限 [0 .. 10]' 目标 c

[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]

由于未捕获的异常“NSRangeException”而终止应用程序。 [__NSArrayM objectAtIndex:]:索引 33 超出范围 [0 .. 32]'

-[__NSArrayM objectAtIndex:]:索引 0 超出了带有 userInfo 的空数组的界限(null)