簡體   English   中英

我第一次告訴NSTimer停止,然后拒絕停止

[英]NSTimer stops the first time I tell it to, then refuses to stop

我已經在我的UIViewController標頭中聲明了NSTimer

NSTimer *mainTimer;

然后在實現中的viewWillAppear方法中啟動它,因此:

mainTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateAll) userInfo:nil repeats:YES];

我有一個名為showInfo用於翻轉視圖(標准實用程序應用模板)的showInfo ,它具有以下命令:

[mainTimer invalidate];

當我的應用啟動時,計時器就會啟動並執行操作。 我第一次點擊該按鈕並且視圖翻轉時,計時器停止。 當我完成flipSideViewController並重新出現主視圖時,計時器再次啟動。 到目前為止,很好。 問題是隨后的按鈕按下(因此對[mainTimer invalidate]調用不會使計時器停止。它一直在繼續。我可以來回翻轉所有想要的東西,並且它會不斷更新。對於笑容,我放了兩個連續invalidate呼叫invalidate ,但這會導致崩潰。

更新:

找到了問題。 flipSideViewController返回后,我自己調用了viewWillAppear ,它將創建計時器。 運行循環還會自動調用viewWillAppear ,因此創建了第二個計時器。 這僅在我訪問過另一側后才發生,因此,當我第一次翻轉時,計時器(單個實例)將正常停止。 奇怪的是我可以創建兩個具有相同名稱的計時器...

一旦計時器失效,它將不再觸發。

因此,如果“計時器持續運行”,則它是一個不同的計時器。 確保您在說自己認為的實例。 我已經看到了很多錯誤,這些錯誤是開發人員分配/初始化一個實例,然后加載NIB並導致特定類的另一個實例起作用的。 我可以在這里看到類似的情況。

注意,不可能在作為計時器目標的對象的解除分配中使計時器無效。 計時器將保留目標,因此無法在首先使計時器無效的情況下正確地重新分配目標。

我只是做完全一樣的,它似乎對我有用。 我在xcode模板中做了什么:

轉到MainViewController.h並輸入:

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> {
    NSTimer* timer;
}

@property (nonatomic, retain) NSTimer* timer;

- (IBAction)showInfo:(id)sender;

@end

轉到MainViewController.m並添加:

@synthesize timer;

-(void) viewWillAppear:(BOOL)animated {
    NSLog(@"Timer!");
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateAll) userInfo:nil repeats:YES];
}

-(void) updateAll {
    NSLog(@"run");
}

- (IBAction)showInfo:(id)sender {    
    [timer invalidate];
    FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];
    controller.delegate = self;

    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:controller animated:YES];

    [controller release];
}

就是這樣,它對我來說很好。 這樣有幫助嗎? 也許您的問題出在其他地方-您在updateAll做什么?

[NSTimer invalidate]的文檔中:

阻止接收器再次觸發並請求將其從運行循環中刪除。

因此,我將致電作廢,然后釋放您的計時器。 首先,您似乎並沒有保留計時器。 因此,請在保留計時器時保留它,並在需要時使其失效,然后在失效后釋放它。

下一個視圖將出現,請確保您正在制作並保留一個新計時器。

viewWillAppear可能被多次調用。

創建計時器之前,請確保計時器已失效

[mainTimer invalidate];
mainTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateAll) userInfo:nil repeats:YES];

當然,如果您還在其他地方使計時器無效,則應將其分配為null。

[mainTimer invalidate];
mainTimer = NULL;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM