SIGABRT фатальная ошибка - PullRequest
       4

SIGABRT фатальная ошибка

0 голосов
/ 27 октября 2011

У меня есть UIPickerView. Когда я выбираю строку, это происходит:

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

switch ([defaults integerForKey:@"randomIndex"]) {
    case 1:
        switch (component) {
            case 0:
                [defaults setInteger:row forKey:@"randomIndex"];
                [defaults synchronize];
                [colourPicker reloadAllComponents];
                [colourPicker selectRow:[defaults integerForKey:@"randomIndex"] inComponent:0 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"dice1Index"] inComponent:1 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"dice2Index"] inComponent:2 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"colourIndex"] inComponent:3 animated:NO];
                break;
            case 1:
                [defaults setObject:([diceArray objectAtIndex:row]) forKey:@"dice"];
                [defaults setInteger:row forKey:@"dice1Index"];
                [defaults synchronize];
                break;
            case 2:
                [defaults setObject:([diceArray objectAtIndex:row]) forKey:@"dice"];
                [defaults setInteger:row forKey:@"dice2Index"];
                [defaults synchronize];
                break;
            case 3:
                [defaults setObject:([colourArray objectAtIndex:row]) forKey:@"colour"];
                [defaults setInteger:row forKey:@"colourIndex"];
                [defaults synchronize];
                break;
        }
        break;
    case 0:
        switch (component) {
            case 0:
                [defaults setInteger:row forKey:@"randomIndex"];
                [defaults synchronize];
                [colourPicker reloadAllComponents];
                [colourPicker selectRow:[defaults integerForKey:@"randomIndex"] inComponent:0 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"dice1Index"] inComponent:1 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"colourIndex"] inComponent:2 animated:NO];
                break;
            case 1:
                [defaults setObject:([diceArray objectAtIndex:row]) forKey:@"dice"];
                [defaults setInteger:row forKey:@"dice1Index"];
                [defaults synchronize];
                break;
            case 2:
                [defaults setObject:([colourArray objectAtIndex:row]) forKey:@"colour"];
                [defaults setInteger:row forKey:@"colourIndex"];
                [defaults synchronize];
                break;
        }
        break;
}

}

В iOS Simulator, когда я захожу в UIPicker View и меняю 1-й столбец на второй ряд, а затем обратно на первый, получаю SIGABRT фатальную ошибку Вот журнал:

2011-10-27 16:02:55.516 Random[31369:b303] *** Terminating app due to uncaught exception       'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 3 beyond bounds [0 ..   2]'
 *** Call stack at first throw:
 (
0   CoreFoundation                      0x00dc45a9 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x00f18313 objc_exception_throw + 44
2   CoreFoundation                      0x00dba0a5 -[__NSArrayM objectAtIndex:] + 261
3   UIKit                               0x0000b750 -[UIPickerView      _selectRow:inComponent:animated:notify:] + 125
4   UIKit                               0x0000b6cd -[UIPickerView  selectRow:inComponent:animated:] + 64
5   Random                              0x00004747 -[FlipsideViewController  pickerView:didSelectRow:inComponent:] + 855
6   UIKit                               0x0000bc34 -[UIPickerView  _sendSelectionChangedForComponent:] + 100
7   UIKit                               0x0000ba15 -[UIPickerView  scrollerDidEndSmoothScrolling:] + 75
8   UIKit                               0x001b97c7 -[UIScroller(Internal)  _stopScrollingNotify:dealloc:pin:] + 692
9   UIKit                               0x001bb1d0 -[UIScroller(Static)  _smoothScroll:] + 4743
10  UIKit                               0x001b1488 ScrollerHeartbeatCallback + 129
11  GraphicsServices                    0x00fff3a3 HeartbeatTimerCallback + 35
12  CoreFoundation                      0x00da58c3  __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
13  CoreFoundation                      0x00da6e74 __CFRunLoopDoTimer + 1220
14  CoreFoundation                      0x00d032c9 __CFRunLoopRun + 1817
15  CoreFoundation                      0x00d02840 CFRunLoopRunSpecific + 208
16  CoreFoundation                      0x00d02761 CFRunLoopRunInMode + 97
17  GraphicsServices                    0x00ffc1c4 GSEventRunModal + 217
18  GraphicsServices                    0x00ffc289 GSEventRun + 115
19  UIKit                               0x00024c93 UIApplicationMain + 1160
20  Random                              0x00001cb9 main + 121
21  Random                              0x00001c35 start + 53
22  ???                                 0x00000001 0x0 + 1
    )
terminate called throwing an exceptionCurrent language:  auto; currently objective-c
(gdb) 

Почему это происходит?

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Один из ваших вызовов [UIPickerView selectRow:inComponent:animated:] просит систему выбрать четвертую запись (индекс: 3) в столбце, который имеет только 3 строки (максимальный индекс: 2). Не видя больше вашего кода, я не могу сказать вам, почему это происходит.

0 голосов
/ 27 октября 2011

ваш массив имеет индексы только для 2. Но когда вы выбираете строку, он пытается получить доступ к третьему объекту индекса в массиве, который не существует. Так что попробуйте сосредоточиться на количестве массивов

...