我有一个简单的程序,它使用NSTimer每秒播放声音。我已经声明了NSTimer变量,但是XCode认为它没有被使用。除此之外,计时器不响应invalidate命令,甚至不释放它或将其设置为nil。我试图摆脱该行的可变部分,只是拥有“[NSTimer ...]”部分,但后来我不能使它无效。
这是.h文件:
#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
这是.m文件:
#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
nib文件包含一个开始按钮和一个停止按钮。按下开始按钮会使计时器启动并且文件播放完全正常,但一旦启动它就无法停止。
这里有什么明显的错误吗?在线搜索没有任何结果,我尝试的任何东西都没有。
答案 0 :(得分:4)
您通过在startButtonPressed中声明一个具有相同名称的局部变量来隐藏timer1的成员声明:
删除NSTimer *声明,以便将新计时器分配给成员变量。您还需要执行保留,以便您的成员变量保留引用。
- (IBAction)startButtonPressed:(id)sender {
timer1 = [[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(timerFunction:) userInfo:nil repeats: YES] retain];
}
还要确保释放timer1并在完成后将其设置为nil。