Access NSArray from NSTimer = EXC_BAD_ACCESS

I have a code that looks like this:

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

And in the selector, I have this:

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

But it looks like I can't access my array inside ActionTime! Perhaps I missed something?

+2
objective-c iphone cocoa
Jun 22 '09 at 14:52
source share
2 answers

arrayWithObjects: returns an object with auto-implementation, and since you do not save it, it is freed at the end of the run loop before your timer fires. You want to either save it or use the equivalent alloc / init method, and release it when you are done with it. Remember to read about memory management first, but you will run into all of these problems until you get a good idea about it.

+8
Jun 22 '09 at 15:16
source share
โ€” -

You will need to make the targetColors array and actualColor variable into instance variables for your class so that they can be used in the timer method. It will look something like this:

 @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
Jun 22 '09 at 15:14
source share



All Articles