2012-02-02 78 views
2

可能重复:
NSTimer doesn't stop无法无效(停止)的NSTimer

我使用的NSTimer而音频播放更新滑块的值。

if (sliderUpdateTimer) { 
    [sliderUpdateTimer invalidate]; 
    sliderUpdateTimer=nil; 
} 

sliderUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSliderForAudio) userInfo:nil repeats:YES]; 

一旦音频完成播放我无效的音频播放器委托方法中的计时器。

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ 
NSLog(@"audioPlayerDidFinishPlaying"); 
[player release]; 
audioPlayer=nil; 

[sliderUpdateTimer invalidate]; 
[sliderUpdateTimer release]; 
sliderUpdateTimer=nil; 

}

委托方法获取调用,但计时器没有停止....我只有一次线程对此我乳宁计时器。但还是计时器不会停止....这方面的任何帮助,欢迎...

+0

即停止计时器的正确方法,一定有什么其他错误。你在看什么?函数'updateSliderForAudio'仍然被调用?你怎么知道?应用程序崩溃了吗? – 2012-02-02 09:11:43

+0

该方法包含'如果(sliderUpdateTimer){...'代码??? – 2012-02-02 09:12:15

+0

该应用没有崩溃。但是,即使在定时器失效之后,updateSliderForAudio也会被连续调用。即使在使方法失效之后,方法中的日志语句也会被调用 – 2012-02-02 09:17:44

回答

6

首先,你会在释放它,应该得到EXC_BADACCESS(你不持有计时器,当你设置它,所以你不应该释放它)。难道只能拨打:

[sliderUpdateTimer invalidate]; 
sliderUpdateTimer=nil; 

由于您没有收到崩溃,似乎sliderUpdateTimernil调用audioPlayerDidFinishPlaying:时。用户NSLog或放置一个断点来检查这是否为真。如果是这样的话,你可能就在某个点设置为零,搜索slideUpdateTimer和检查情况可能发生。

3

从代码的第1部拆卸以下线后尝试

if (sliderUpdateTimer){ 
    [sliderUpdateTimer invalidate]; 
    sliderUpdateTimer=nil; 
} 

不需要调用sliderUpdateTimer对象

上发布消息,因为您已经创建了一个对象,具有自动释放待定消息

这里没有必要使用这些行。

我希望这会起作用。

4

嘿尝试这件事情......

- (void)stopTimer{ 
    [sliderUpdateTimer invalidate]; 
    //don't release it. as it is autoreleased. 
    //[sliderUpdateTimer release]; 
    sliderUpdateTimer=nil; 
} 


-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ 
    NSLog(@"audioPlayerDidFinishPlaying"); 
    [player release]; 
    audioPlayer=nil; 
    [self performSelectorOnMainThread:@selector(stopTimer) withObject:nil waitUntilDone:NO]; 
} 

我知道你只有一个线程,但可能有两种不同的运行循环