gadgetmo
gadgetmo

Reputation: 3172

SIGABRT fatal error

I have got a UIPickerView. When I select a row, this happens:

- (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;
}

}

In the iOS Simulator, when I go onto the UIPicker View and change the 1st column to the second row and then back to the first a get a SIGABRT fatal error. Here is the log:

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) 

Why is this happening?

Upvotes: 0

Views: 615

Answers (2)

Tendulkar
Tendulkar

Reputation: 5540

your array is having indexes unto 2 only.But you when you are selecting row it is trying to access the 3rd index object in the array which is not existing.So try to focus on the array count

Upvotes: 0

Benjie
Benjie

Reputation: 7946

One of your calls to [UIPickerView selectRow:inComponent:animated:] is asking the system to select the fourth entry (index: 3) in a column that only has 3 rows (max index: 2). Without seeing more of your code I cannot tell you why this is happening.

Upvotes: 2

Related Questions