[英]How to stop an NSTimer that I don't know is released or not
很抱歉提出這個問題,但是現在是第三天,我試圖解決這個問題,到目前為止還沒有任何進展。
問題是這樣的:在游戲過程中,用戶回答一個問題和下一個問題之間存在停頓。 同樣在其他幾種情況下,游戲中也會出現這種暫停。 為此,我使用一個NSTimer。
在.h中,我有:
@property(nonatomic,retain) NSTimer *scheduleTimer;
並在.m中
@synthesize scheduleTimer;
scheduleTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO];
現在這很好用。 但是,當用戶退出ViewController時,我需要使計時器無效。 否則,計時器將觸發,然后使應用程序崩潰或彈出不屬於其他視圖等的內容。
因此我寫:
- (void)viewWillDisappear:(BOOL)animated {
[scheduleTimer invalidate];
}
現在,如果確實設置了計時器,就可以完成此工作。 但是,如果沒有安排這樣的計時器,則應用程序將崩潰。
我嘗試了可能存在的所有內容,包括@try(它也使應用程序崩潰,Zombie說“ * -[CFRunLoopTimer無效]:消息發送到已釋放實例0x567640”)。 由於計時器是在完成后釋放的,因此[scheduleTimer isValid]也將使應用程序崩潰。
現在我已經非常絕望了,作為最后的選擇,我正在考慮將計時器替換為不可見的UIView animateWithDuration。
但是,我認為這應該是一個非常標准的情況。 我只是不知道為什么我找不到這個非常明顯的任務的答案。 你能幫我嗎? 謝謝
我認為問題在於,在使NSTimer
invalidate
之前,它會自動釋放。
因此,您應該執行以下操作:
scheduleTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO] retain];
並且您還應該在viewWillDisappear:
release
計時器viewWillDisappear:
[scheduleTimer release];
但是,更好的解決方案可能是使用dot屬性語法來保留/釋放:
self.scheduleTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO];
接着:
- (void)viewWillDisappear:(BOOL)animated {
if (self.scheduleTimer != nil) {
[self.scheduleTimer invalidate];
self.scheduleTimer = nil;
}
}
創建使計時器無效的方法,該方法還將屬性設置為nil:
- (void) invalidateTimer
{
if (self.scheduleTimer) {
[self.scheduleTimer invalidate];
self.scheduleTimer = nil;
}
}
...,然后在您使計時器無效時調用該方法。 例如:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear: animated];
[self invalidateTimer];
}
使用以下方法確保保留計時器:
self.scheduleTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.