帮助我...由于未捕获的异常'NSRangeException'终止应用,

时间:2011-02-22 12:12:17

标签: iphone iphone-sdk-3.0

- (void)viewDidLoad {
    [super viewDidLoad];
    NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] 
         initWithTarget:self selector:@selector(loadImage) object:nil];
    [queue addOperation:operation]; 
    [operation release];

    NSMutableArray *_array = [[NSMutableArray alloc] initWithCapacity:10000];
    self.array = _array;
    [_array release];
}

- (void)loadImage
{
  for(int i = 0;i < [appDelegate.ArrParseData count]; i++ )
    {   
        NSLog(@" count %i",i);

        // Configure the cell...
        XMLTags *xmltag = [appDelegate.ArrParseData objectAtIndex:i];
        NSString *Img_id, *Img_name, *DynamicImgUrl;
        Img_id = xmltag.equip_id;
        Img_name = xmltag.image;

        DynamicImgUrl = [NSString stringWithFormat:@"http://testetete.com/pics/equipment/%@/%@",Img_id, Img_name];

        NSURL *ImageUrl = [NSURL URLWithString:DynamicImgUrl];
        NSLog(@" ccxvount %@",ImageUrl);
        UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:ImageUrl]]; 
        NSLog(@" ccxvount %i",i);

        [self.array addObject:image];

        NSLog(@" ccxvount %i",i);
    }



       [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
    }

    // Customize the appearance of table view cells.
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }




        UIImageView *top_img = [[UIImageView alloc] initWithFrame:CGRectMake(10, 25, 75, 80)];
        CGRect rect = top_img.frame;

        rect.size.height = 60;
        rect.size.width = 60;
        top_img.frame = rect;

        // the imageView holds the image myImg
        top_img.image = [self.array objectAtIndex:indexPath.row];

        //cell.imageView.image=image;
        [cell.contentView addSubview:top_img];




        return cell;
    }

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        // Return the number of sections.
        return 1;
    }


    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        // Return the number of rows in the section.
        return [appDelegate.ArrParseData count];
    }

当我执行上面的代码时,我的应用程序崩溃,出现以下错误..

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x026cc919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0281a5de objc_exception_throw + 47
    2   CoreFoundation                      0x026c2465 -[__NSArrayM objectAtIndex:] + 261
    3   AgSearch                            0x00006f80 -[EquipmentViewController tableView:cellForRowAtIndexPath:] + 752
    4   UIKit                               0x00345a3f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 619
    5   UIKit                               0x0033bad2 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
    6   UIKit                               0x0035040c -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
    7   UIKit                               0x003484bc -[UITableView layoutSubviews] + 242
    8   QuartzCore                          0x024620d5 -[CALayer layoutSublayers] + 177
    9   QuartzCore                          0x02461e05 CALayerLayoutIfNeeded + 220
    10  QuartzCore                          0x0246164c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 302
    11  QuartzCore                          0x024612b0 _ZN2CA11Transaction6commitEv + 292
    12  QuartzCore                          0x02468f5b _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99
    13  CoreFoundation                      0x026add1b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
    14  CoreFoundation                      0x02642987 __CFRunLoopDoObservers + 295
    15  CoreFoundation                      0x0260bc17 __CFRunLoopRun + 1575
    16  CoreFoundation                      0x0260b280 CFRunLoopRunSpecific + 208
    17  CoreFoundation                      0x0260b1a1 CFRunLoopRunInMode + 97
    18  GraphicsServices                    0x02f312c8 GSEventRunModal + 217
    19  GraphicsServices                    0x02f3138d GSEventRun + 115
    20  UIKit                               0x002e3b58 UIApplicationMain + 1160
    21  AgSearch                            0x0000206c main + 102
    22  AgSearch                            0x00001ffd start + 53
    23  ???                                 0x00000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'

任何帮助都将非常感谢....

感谢您的帮助

4 个答案:

答案 0 :(得分:4)

显示表时数组是否有任何数据?如果你给出一个大于0的默认单元格,并且数组中没有数据,那么你将收到你所描述的错误。

'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array'

修改

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return [appDelegate.ArrParseData count];
}

你不应该从appDelegate.ArrParseData返回元素的数量,因为如果那个数组填充了数据,那么你将收到一个大于0的数字。

在cellForRowAtIndexPath中,您要求索引X处的信息,但是self.array尚未填充数据,因为您将loadImage方法称为异步。

你应该在numberOfRowsInSection方法中返回 [self.array count];

答案 1 :(得分:0)

我认为您没有显示需要显示的所有代码 - 跟踪显示异常在cellForRowAtIndexPath中发生一段时间。看起来你正在访问一个什么都不包含的数组 - 你是否完全确定在你尝试使用它时已经加载了数组?

很可能你知道有多少个单元格,并且你通过numberOfRowsInSection正确报告,但是你还没有在需要时填充数组。您需要显示占位符,直到加载完成,将图像保留为空(空)直到准备好,使数据加载/视图外观顺序,让负载在后台发生或类似的事情。

答案 2 :(得分:0)

您的行数方法是从包含图像的行数中访问不同的计数数组,不是吗?

如果您不以并发方式执行此代码,则不会出现此错误。当必须填写图像数组的线程比主线程慢时,问题就出现了。

因此,您最好的解决方案是在访问图像数组之前检查图像数组大小,如果您希望每次获得新图像时都可以向tableView发送reloadRowsAtIndexPaths:withRowAnimation:消息。这会给你一个很好的加载效果。

我希望我已经足够清楚了。

见到你!

答案 3 :(得分:0)

也许有人像我一样犯了这样愚蠢的错误: - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 并尝试做这样的事情:SomeObject = [SomeContainer objectAtIndex:indexPath];或者甚至尝试使用强制转换聪明:SomeObject = [SomeContainer objectAtIndex:(int)indexPath];错误

没办法......只是 记住得到索引你必须打电话给indexPath.row !!!!!