NSThread内でNSTimerを実行していますか?

iphone nsthread nstimer
NSThread内でNSTimerを実行していますか?

アプリケーションのバックグラウンドでタイマーを実行しようとしています 私のタイマークラスはシングルトンなので、新しいタイマーを開始すると、古いタイマーが割り当てを解除します。

+ (void)timerThread{

    timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimerThread) object:nil]; //Create a new thread
    [timerThread start]; //start the thread
}

//the thread starts by sending this message
+ (void) startTimerThread
{
    timerNSPool = [[NSAutoreleasePool alloc] init];
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(startTime:) userInfo:nil repeats:YES];
    //timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(startTime:) userInfo:nil repeats:YES];
    //[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    [runLoop run];
    [timerNSPool release];
}

+ (void)startTime:(NSTimer *)theTimer{

    if(timeDuration > 1)
        timeLabel.text = [NSString stringWithFormat:@"%d",--timeDuration];
    else{
        [self stopTimer];
        [delegate timeIsUp];
    }

}
+ (void) stopTimer{

    if(timer != nil)
    {
        [timerThread release];
        [timeLabel release];
        [timer invalidate];
        timer = nil;
    }

}

メインスレッドrunLoopでNSTimerをアプリケーションのautoreleasepoolで実行しても問題はありませんでした。 [timerNSPool release]でリークが発生しています。 GeneralBlock-16 Malloc WebCore WKSetCurrentGraphicsContext

リークの原因は、セカンダリスレッドからUIを更新していることです。

timeLabel.text = [NSString stringWithFormat:@"%d",--timeDuration];

ただし、別のメソッドupdateTextLblを追加し、これを使用して呼び出しています

[self performSelectorOnMainThread:@selector(updateTextLbl) withObject:nil waitUntilDone:YES];

メインスレッドで。 リークはまったくありませんでしたが、これは2番目のスレッドを作成する目的に反します。

これは私の最初の投稿であり、私はすべての助けに感謝しますありがとう…​ あらかじめ…​.

  1  0


ベストアンサー

`+ startTime:`でUIを更新していますが、そのメソッドはメインスレッドでは実行されません。 これがWebCoreの警告の原因かもしれません。

2


カフから外れると、そこにあるNSRunLoopは少しずれているように見えます。 ドキュメントから:

_
一般に、アプリケーションはNSRunLoopオブジェクトを作成または明示的に管理する必要はありません。 アプリケーションのメインスレッドを含む各NSThreadオブジェクトには、必要に応じて自動的に作成されたNSRunLoopオブジェクトがあります。 現在のスレッドの実行ループにアクセスする必要がある場合は、クラスメソッドcurrentRunLoopを使用してアクセスします。
_

スレッドを開始するタイマーがあり、現在の実行ループを取得して実行を開始しようとします。 タイマーをその実行ループに関連付けますか?

への呼び出しを介して:

_
(void)addTimer:(NSTimer *)aTimer forMode:(NSString *)モード
_

?

0


タイトルとURLをコピーしました