2012-02-02 77 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]; 
} 

我知道你只有一個線程,但可能有兩種不同的運行循環