[__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
的有效索引。
(顺便说一句——myArray
是objects
数组的可变副本。你为什么要这样做?你没有对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)