0

player が (非アトミック、retain) であり、player = _player を使用して合成される場合、次のシナリオのうち正しいコーディング方法はどれですか。

シナリオA

MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
        self.player = mp;
        [mp release];

シナリオB

MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    self.player = mp;

これまではシナリオ A を一般的な方法として使用してきましたが、これがコード内でメモリ リークを引き起こしている可能性があると思います。

助けてくれてありがとう。

編集1:

タイマーにも同じことが当てはまりますか?以下のコードを使用している場合、これは正しいですか? timerMap も (nonatomic、retain) であり、timerMap = _timerMap を使用する場合。

self.timerMap = [[NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(updateAnimationTimer) userInfo:nil repeats:YES] autorelease];

また、解放するときは無効化するだけでよいのでしょうか、それとも無効化してから解放するべきでしょうか?

4

3 に答える 3

4

シナリオAは間違いなく進むべき道であり、シナリオBは漏れますmp

出典:Apple Doc

編集1:

投稿したコードは間違っていtimerMapます。プロパティを再度設定するとクラッシュします。してはいけautoreleaseない

self.timerMap = [NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(updateAnimationTimer) userInfo:nil repeats:YES];

タイマーが不要になったら、

self.timerMap = nil; 

releaseこれにより、タイマーのメソッドが呼び出され、ポインターがnil

于 2012-07-23T10:11:36.040 に答える
1

シナリオ A は正しいです。シナリオ B では実際にメモリ リークが発生します。これは、self.player = mp; が原因です。参照カウンターを保持します。

次のコードも正しいです。

MPMoviePlayerController *mp = [[[MPMoviePlayerController alloc] initWithContentURL:movieURL] autorelease];
self.player = mp;
于 2012-07-23T10:15:25.417 に答える
1

最初のものは正しいメモリ管理ですが、私はただ次のことを好む傾向があります。

self.player = [[[MPMoviePlayerController alloc] 
                 initWithContentURL:movieURL] 
                 autorelease];

このようにして、そのオブジェクトのすべてのメモリ管理を 1 行にまとめます。

質問への編集に続く編集

あなたが持っているタイマーオブジェクトはすでに autoreleaseautoreleaseです。再度追加しないでください。便利なメソッドの説明については、この質問をご覧ください。

于 2012-07-23T10:15:47.297 に答える