2009-06-22 4 views
2

J'ai un code qui ressemble à ceci:Accès NSArray à partir d'un intervalle NSTimer = EXC_BAD_ACCESS

actualColor = 0; 
targetColors = [NSArray arrayWithObjects:[UIColor blueColor], 
             [UIColor purpleColor], 
             [UIColor greenColor], 
             [UIColor brownColor], 
             [UIColor cyanColor], nil]; 
timer = [NSTimer scheduledTimerWithTimeInterval:3.0 
             target:self 
             selector:@selector(switchScreen) 
             userInfo:nil 
             repeats:YES]; 

Et dans le sélecteur i cette:

- (void) switchScreen 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationDelegate:self]; 

    int totalItens = [targetColors count]; 
    NSLog(@"Total Colors: %i",totalItens); 
    if(actualColor >= [targetColors count]) 
    { 
     actualColor = 0; 
    } 

    UIColor *targetColor = [targetColors objectAtIndex:actualColor]; 

    if(!firstUsed) 
    { 
     [firstView setBackgroundColor:targetColor]; 
     [secondView setAlpha:0.0]; 
     [firstView setAlpha:1.0]; 
     firstUsed = YES; 
    } 
    else 
    { 
     [firstView setBackgroundColor:targetColor]; 
     [secondView setAlpha:1.0]; 
     [firstView setAlpha:0.0]; 
     firstUsed = NO; 
    } 
    [UIView commitAnimations]; 

    actualColor++;   
} 

Mais il semble que je ne peux pas accéder à mon array dans l'action scheduledTimer! Ai-je peut-être manqué quelque chose?

Répondre

8

arrayWithObjects: retourne un objet autoreleased, et puisque vous n'êtes pas le retenir, il est d'être désattribuées à la fin de la boucle d'exécution, avant que vos feux de minuterie. Vous voulez soit le conserver, soit utiliser la méthode équivalente alloc/init, et le relâcher lorsque vous avez terminé. Assurez-vous de lire tout d'abord sur la gestion de la mémoire, vous allez rencontrer toutes sortes de problèmes de ce genre jusqu'à ce que vous ayez une bonne compréhension.

0

Vous devrez créer le tableau targetColors et la variable actualColor en variables d'instance pour votre classe afin qu'elles puissent être utilisées dans la méthode timer. Il ressemblerait à quelque chose comme ceci:

@interface YourClass : NSObject 
{ 
    //... 
    int actualColor; 
    NSArray * targetColors; 
} 
@end 

@implementation YourClass 

- (id)init 
{ 
    if ((self = [super init]) == nil) { return nil; } 

    //... 
    actualColor = 0; 
    targetColors = [[NSArray arrayWithObjects:[UIColor blueColor], 
               [UIColor purpleColor], 
               [UIColor greenColor], 
               [UIColor brownColor], 
               [UIColor cyanColor], 
              nil] retain]; 
    return self; 
} 

- (void)dealloc 
{ 
    [targetColors release]; 
    //... 
    [super dealloc]; 
} 

//... 

@end 
+0

Aucune idée pourquoi ceci a été rejeté. merci pour l'idée! – cregox

Questions connexes