0

ムービープレーヤー (theMovie) を解放し、完全に解放された後に別のアクション (いわゆる playButtonClicked) を開始することを目指しています。「playButtonClicked」を 1 秒間遅らせるために performSelector を使用しましたが、うまくいきました。コードは次のとおりです。

【映画公開】; [self performSelector:@selector(playButtonClicked) withObject:nil afterDelay:1];

ただし、常に1秒遅らせたいわけではありません。「theMovie」が完全に解放されたらすぐに「playButtonClicked」を開始したいと考えています。次のコードを試してみましたが、[timer userInfo] が nil にならないため、うまくいきませんでした。ムービープレーヤーのリリースが終了したことを確認する方法を知っている人はいますか?

[theMovie release];
//[self performSelector:@selector(playButtonClicked) withObject:nil afterDelay:1];

NSTimer *atimer =   [NSTimer scheduledTimerWithTimeInterval:0.1 target:self 
                                                  selector:@selector(waitForReleaseFinish:)
                                                  userInfo: (MPMoviePlayerController*) theMovie repeats:YES];

waitForRleaseFinish: (NSTimer *)timer のコードは次のとおりです。

if ([timer userInfo]==nil)  //here I actually want to test if (theMovie==nil),but I don't know how to do and I'm not sure if it is a correct way to determine the release finished.
{
     [timer invalidate];
    [self playButtonClicked];
}

楽しみにしています。ありがとうございました。

4

1 に答える 1

1

必要はありません。

次のように、プレーヤーを解放してから playButtonClicked を呼び出すと、次のようになります。

[theMovie release];
[self playButtonClicked];

最初の行が完了するか、theMovie がリリースされるまで、2 行目は実行されません。これはすべて同じスレッド上にあるため、順番に実行されます。これにはタイマーは必要ありません。ただし、完了を待っているものが新しいスレッドで実行される状況では、所要時間を推測するのではなく、コールバックを使用します (これは 1 秒よりもはるかに短いです!)。

また、誤解のないように言っておくと、「完全に解放する」とは、retainCount を 1 だけ減算することです。ゼロになると、自動的に割り当てが解除されます。

補足として、playButtonClicked が実行される前に theMovie を解放する (割り当てを解除する) ことが重要なのはなぜですか?

また、waitForReleaseFinish: コード機能しますが、タイマーが作成される前に theMovie が解放されるため不要です。

于 2010-06-05T03:16:00.060 に答える