数组超出绑定崩溃

时间:2013-10-20 12:21:30

标签: ios arrays crash

我目前有一个数组出界问题,无法找到解决方法。我怀疑从我的崩溃报告中我遇到了这部分代码的问题。任何建议,我该如何解决这个问题?随意询问具体代码。

-(void)viewDidLoad
{
    NSLog(@"a");
    [super viewDidLoad];    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSFileManager *fileManager  = [NSFileManager defaultManager];

    //configure carousel1
    NSString *fPath = [documentsDirectory stringByAppendingPathComponent:@"Tops"];
    NSArray *directoryContent = [fileManager directoryContentsAtPath: fPath];
    imageArray1 = [directoryContent mutableCopy];
    NSLog(@"%@", [imageArray1 objectAtIndex:0]);←This line is 70
    NSLog(@"1:::%d", [imageArray1 count]);

    //configure carousel2
    fPath = [documentsDirectory stringByAppendingPathComponent:@"Bottoms"];
    directoryContent = [fileManager directoryContentsAtPath:fPath];
    NSLog(@"%@", fPath);
    imageArray2 = [directoryContent mutableCopy];
    NSLog(@"2:::%d", [imageArray2 count]);

    carousel1.type = iCarouselTypeLinear;
    carousel2.type = iCarouselTypeLinear;

    [carousel1 reloadData];
    [carousel2 reloadData];

    carousel1.delegate = self;
    carousel1.dataSource = self;
    carousel2.delegate = self;
    carousel2.dataSource = self;
}

更新

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Triggered by Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x2edecf4e __exceptionPreprocess + 126
1   libobjc.A.dylib                 0x390986aa objc_exception_throw + 34
2   CoreFoundation                  0x2ed235ee -[__NSArrayM objectAtIndex:] + 226
3   Appname                         0x000acab8 -[iCarouselExampleViewController viewDidLoad] (iCarouselExampleViewController.m:70)
4   UIKit                           0x315625fe -[UIViewController loadViewIfRequired] + 514
5   UIKit                           0x315623bc -[UIViewController view] + 20
6   UIKit                           0x3160c632 -[UIViewController shouldAutorotate] + 22
7   UIKit                           0x31648d76 -[UIViewController _preferredInterfaceOrientationForPresentationInWindow:fromInterfaceOrientation:] + 246
8   UIKit                           0x316476ae -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:animation:] + 2054
9   UIKit                           0x31646700 -[UIViewController presentViewController:withTransition:completion:] + 4664
10  UIKit                           0x31821656 -[UIViewController presentModalViewController:animated:] + 26
11  UIKit                           0x31592f3a -[UIApplication sendAction:to:from:forEvent:] + 86
12  UIKit                           0x31592eda -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 26
13  UIKit                           0x31592eb4 -[UIControl sendAction:to:forEvent:] + 40
14  UIKit                           0x3157eb3a -[UIControl _sendActionsForEvents:withEvent:] + 370
15  UIKit                           0x3159292a -[UIControl touchesEnded:withEvent:] + 586
16  UIKit                           0x315925fc -[UIWindow _sendTouchesForEvent:] + 524
17  UIKit                           0x3158d688 -[UIWindow sendEvent:] + 828
18  UIKit                           0x31562a20 -[UIApplication sendEvent:] + 192

2 个答案:

答案 0 :(得分:0)

您没有共享日志的输出,这将有所帮助,也没有您的委托方法,这将有所帮助。也就是说,在设置数据源和委托之后,你应该将reloadData作为最后一条消息发送 - 这是一种很好的做法(似乎最近iOS推迟了动作直到运行循环结束)。

答案 1 :(得分:0)

如果我冒险猜测,目录是空的。

imageArray1 = [directoryContent mutableCopy];
NSLog(@"%@", [imageArray1 objectAtIndex:0]);←This line is 70

如果imageArray1没有内容,则第70行会崩溃,就像您的报告所示。您应该检查[imageArray1 count]而不是崩溃,只有在有值的情况下才使用它。你的代码在这里并没有对这些数组做任何事情,但这里的结构应该是这样的。你还需要为carousel2做同样的事情。

//configure carousel1
NSString *fPath = [documentsDirectory stringByAppendingPathComponent:@"Tops"];
NSArray *directoryContent = [fileManager directoryContentsAtPath: fPath];
imageArray1 = [directoryContent mutableCopy];
if ([imageArray1 count] > 0) {
    NSLog(@"%@", [imageArray1 objectAtIndex:0]); //This line is 70
    NSLog(@"1:::%d", [imageArray1 count]);
} else {
    NSLog(@"No objects in imageArray1.");
}