iPhone:NSTimer不响应invalidate,XCode坚持认为该变量未声明

时间:2012-05-20 23:26:24

标签: iphone xcode nstimer

我有一个简单的程序,它使用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文件包含一个开始按钮和一个停止按钮。按下开始按钮会使计时器启动并且文件播放完全正常,但一旦启动它就无法停止。

这里有什么明显的错误吗?在线搜索没有任何结果,我尝试的任何东西都没有。

1 个答案:

答案 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。