I’ve got a simple program that uses an NSTimer to play a sound every second. I have declared the NSTimer variable, but XCode thinks it’s unused. In addition to this, the timer does not respond to the invalidate command, or even releasing it or setting it to nil. I have tried getting rid of the variable part of the line and just having the “[NSTimer …]” part, but then I cannot invalidate it later.
Here is the .h file:
#import <UIKit/UIKit.h>
@interface timer_workingViewController : UIViewController {
NSTimer *timer1;
}
@property (nonatomic, retain) NSTimer *timer1;
- (IBAction)startButtonPressed:(id)sender;
- (IBAction)stopButtonPressed:(id)sender;
- (void)timerFunction:(id)sender;
@end
and here is the .m file:
#import "timer_workingViewController.h"
#import <AudioToolbox/AudioToolbox.h>
@implementation timer_workingViewController
@synthesize timer1;
- (IBAction)startButtonPressed:(id)sender {
NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(timerFunction:) userInfo:nil repeats: YES];
}
- (IBAction)stopButtonPressed:(id)sender {
[timer1 invalidate];
[timer1 release];
timer1 = nil;
}
- (void)timerFunction:(id)sender {
NSString *path = [[NSBundle mainBundle] pathForResource:@"bell" ofType:@"wav"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID);
AudioServicesPlaySystemSound(soundID);
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
self.timer1 = nil;
}
- (void)dealloc {
[timer1 invalidate];
[super dealloc];
}
@end
The nib file consists of a start button and a stop button. Pressing the start button causes the timer to start and the file to play perfectly fine, but once started it cannot be stopped.
Anything obviously wrong here? Online searches have turned up nothing and nothing I try works at all.
You are hiding the member declaration of of timer1 by declaring a local variable with the same name in startButtonPressed:
Remove the NSTimer* declaration so that you assign the new timer to the member variable. You’ll also want to do a retain so that you’re member variable keeps a reference.
Also be sure to release timer1 and set it to nil when you’re done with it.