2010-03-11 83 views
3

我不断收到错误的访问错误,我认为这与我的UIPickerView有关,因为这是应用程序崩溃的时候。一切工作正常,直到我从UIPickerView做出第9个选择。每次该应用程序崩溃的第九个选择。有任何想法吗?UIPickerView EXC BAD ACCESS?

- (void)viewDidLoad { 
     [super viewDidLoad]; 



    list = [[NSMutableArray alloc] init]; 
    [list addObject:@"Anvil"]; 
    [list addObject:@"Apple"]; 
    [list addObject:@"Arrow"]; 
    [list addObject:@"Baby"]; 
    [list addObject:@"Basketball"]; 
    [list addObject:@"Beehive"]; 
    [list addObject:@"Blimp"]; 
    [list addObject:@"Bomb"]; 
    [list addObject:@"Bungee Jumper"]; 
    [list addObject:@"Cactus"]; 
    [list addObject:@"Cake"]; 
    [list addObject:@"Car"]; 
    [list addObject:@"Caterpillar"]; 
    [list addObject:@"Couch"]; 
    [list addObject:@"Dennis"]; 

     anvil = [UIImage imageNamed:@"anvil.png"]; 
    apple = [UIImage imageNamed:@"apple.png"]; 
    arrow = [UIImage imageNamed:@"arrow.png"]; 
    baby = [UIImage imageNamed:@"baby.png"]; 
    basketball = [UIImage imageNamed:@"basketball.png"]; 
    beehive = [UIImage imageNamed:@"beehive.png"]; 
    blimp = [UIImage imageNamed:@"blimp.png"]; 
    bomb = [UIImage imageNamed:@"bomb.png"]; 
    bungeejumper = [UIImage imageNamed:@"bungeejumper.png"]; 
    cactus = [UIImage imageNamed:@"cactus.png"]; 
    cake = [UIImage imageNamed:@"cake.png"]; 
    car = [UIImage imageNamed:@"car.png"]; 
    caterpillar = [UIImage imageNamed:@"caterpillar.png"]; 
    couch = [UIImage imageNamed:@"couch.png"]; 
    dennis = [UIImage imageNamed:@"dennis.png"]; 
    } 

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

    -(NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component{ 

    return [list count]; 
    } 

    -(NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 

    return [list objectAtIndex:row]; 
    } 

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

    if([[list objectAtIndex:row] isEqual:@"Anvil"]) { 
     [object setImage:anvil]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Apple"]) { 
     [object setImage:apple]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Arrow"]) { 
     [object setImage:arrow]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Baby"]) { 
     [object setImage:baby]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Basketball"]) { 
     [object setImage:basketball]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Beehive"]) { 
     [object setImage:beehive]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Blimp"]) { 
     [object setImage:blimp]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Bomb"]) { 
     [object setImage:bomb]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Bungee Jumper"]) { 
     [object setImage:bungeejumper]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Cactus"]) { 
     [object setImage:cactus]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Cake"]) { 
     [object setImage:cake]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Car"]) { 
     [object setImage:car]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Caterpillar"]) { 
     [object setImage:caterpillar]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Couch"]) { 
     [object setImage:couch]; 
    } 
    else if([[list objectAtIndex:row] isEqual:@"Dennis"]) { 
     [object setImage:dennis]; 
    } 
    } 

- (void)dealloc { 
[list release]; 
    [super dealloc]; 
[animation release]; 
} 
+0

这不回答你的问题,但你一定要能够把[超级的dealloc];作为dealloc方法的最后一行 - 否则当对象被释放时你可能会崩溃! – deanWombourne 2010-03-11 16:40:47

+0

谢谢,没有注意到。 – NextRev 2010-03-11 16:55:48

回答

4

你没有保留你的UIImages,所以他们正在自动发布。每imageNamed通话结束后,你需要保留即

baby = [[UIImage imageNamed:@"baby.png"] retain]; 

,或者,如果你已经声明它们为属性(即@property (nonatomic, retain) UIImage *baby;),你可以这样做:

self.baby = [UIImage imageNamed:@"baby.png"]; 

这是更正确的方法做到这一点。


然而,处理所有这些代码的一个更好的办法可能是使用图像,而不是检查每一次名字的数组。即

imageArray = [NSArray alloc] initWithObjects: 
       [UIImage imageNamed:@"Anvil.png"], 
       [UIImage imageNamed:@"Apple.png"], 
       [UIImage imageNamed:@"Arrow.png"], 
       nil]; 

,然后,一个项目被选定时,

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    [object setImage:[imagearray objectAtIndex:row]]; 
} 

这是一个小吸尘器;)

编辑:Douglas已清理的代码而予了同样的想法正在写下我的答案的第二部分:)

+0

救生员!如果我保留每个图像,他们需要释放dealloc权利? – NextRev 2010-03-11 16:49:53

+0

好点 - 是的,他们绝对需要释放! – deanWombourne 2010-03-11 16:55:51

0

第九个对象是唯一一个在名称中有空格的对象吗?我不明白这会如何破坏它,寻找它与其他人之间的差异。该图像不是被称为“bungee jumper.png”而不是“bungeejumper.png”是吗?

旁白:而不是字符串列表,你可以有图片标题对EG的列表,

// ... snip ... 
[self addPairWithTitle:@"Anvil" image:@"anvil.png"]; 
[self addPairWithTitle:@"Apple" image:@"apple.png"]; 

- (void) addPairWithTitle .... 
{ 
    // you'll need to define a MyNewPair object which retains the image and title 
    [list addObject:[[MyNewPair alloc] initWithTitle:title andImage:[UIImage imageNamed:imageName]]; 
} 

// ... snip ... 

... titleForRow... 
return [[list objectAtIndex:row] title]; 

...didSelectRow... 
[object setImage:[[list objectAtIndex:row]] image]; 
相关问题