1

我有一个简单的程序,它使用 NSTimer 每秒播放一个声音。我已经声明了 NSTimer 变量,但 XCode 认为它没有被使用。除此之外,计时器不会响应无效命令,甚至不会释放它或将其设置为 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 文件由一个开始按钮和一个停止按钮组成。按下开始按钮会导致计时器启动并且文件可以正常播放,但是一旦启动就无法停止。

这里有什么明显的错误吗?在线搜索一无所获,我尝试的任何方法都不起作用。

4

1 回答 1

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。

于 2012-05-20T23:30:17.807 回答