1
votes

I'm new to iOS dev, so this is probably easy to fix. I have a custom view controller in which I'm adopting the protocols to control a UIPickerView in a nib. Everything works fine unless, in the iPad simulator, I scroll the picker beyond the first item in the list or the last item in the list and release. It kicks the following error:

Thread 1: Program received signal: "EXC_BAD_ACCESS"

on this line of my main.m class:

int retVal = UIApplicationMain(argc, argv, nil, nil);

Relevant code follows:

ViewController.h

@interface BirdColorViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
IBOutlet UIPickerView *birdColorPicker;
NSArray *birdColors;
}

@property (nonatomic,retain) IBOutlet UIPickerView *birdColorPicker;

Viewcontroller.m

- (void)dealloc
{
[birdColorPicker release];
[super dealloc];
}

...

- (void)viewDidLoad
{
    [super viewDidLoad];
    birdColors = [NSArray arrayWithObjects:@"Blue",@"Yellow",@"Red",nil];

    birdColorPicker.delegate = self;
    birdColorPicker.dataSource = self;
}

...

#pragma mark - UIPickerViewDataSource methods

//(UIPickerView *)thePickerView

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{
    return [birdColors count];
}

 #pragma mark - UIPickerViewDelegate methods

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{
    return [birdColors objectAtIndex:row];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{
    // Set value in prefs/model
}
2

2 Answers

2
votes

Try: birdColors = [[NSArray alloc] initWithObjects:@"Blue",@"Yellow",@"Red",nil]; instead of birdColors = [NSArray arrayWithObjects:@"Blue",@"Yellow",@"Red",nil];

0
votes

Make birdColors a property also (nonatomic, retain) like you do with the pickerView. Your array is not being retained, so you're accessing zombie memory. Set NSZombieEnabled=YES in the properties/General panel of your Executable. That will tell you exactly what is being accessed.