2010-03-11 15 views
3

Je continue d'obtenir une erreur d'accès ex mauvais et je pense que cela a quelque chose à voir avec mon UIPickerView parce que c'est quand l'application se bloque. Tout fonctionne bien jusqu'à ce que je fais un 9ème choix de l'UIPickerView. Chaque fois que l'application se bloque sur le 9e choix. Des idées?UIPickerView EXC Mauvais accès?

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

Cela ne répond pas à votre question, mais vous voulez vraiment être mettre [super dealloc]; comme la toute dernière ligne de votre méthode dealloc - sinon vous pourriez avoir un plantage lorsque l'objet est libéré! – deanWombourne

+0

Merci, je n'ai pas remarqué ça. – NextRev

Répondre

4

Vous ne conservez pas vos UIImages pour les autoriser automatiquement. Après chaque appel imageNamed, vous avez besoin retain-à-dire

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

ou, si vous les avez déclarés comme propriétés (c.-à-@property (nonatomic, retain) UIImage *baby;), vous pouvez le faire:

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

qui est la façon plus correcte fais le.


Cependant, une meilleure façon de traiter avec tout ce code pourrait être d'utiliser un tableau d'images au lieu de vérifier le nom à chaque fois. à savoir

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

puis, lorsqu'un élément est sélectionné,

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

qui est un peu plus propre;)

EDIT: Douglas a eu la même idée pour le nettoyage du code alors que je écrivait la deuxième moitié de ma réponse :)

+0

Life Saver! Si je conserve chaque image, ils doivent être libérés dans dealloc droit? – NextRev

+0

bon point - oui, ils ont certainement besoin de libérer! – deanWombourne

0

Le neuvième objet est-il le seul avec un espace dans le nom? Je ne vois pas comment cela pourrait le briser, en cherchant des différences entre lui et les autres. L'image n'est pas appelée "bungee jumper.png" au lieu de "bungeejumper.png" est-ce?

En plus: au lieu d'une liste de chaînes, vous pourriez avoir une liste de paires de titre d'image par exemple,

// ... 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];