0

私は、理論的には無期限に機能するはずのプロジェクトを行ってきました。これは、プログラムを開始し、iPad を電源に接続すると、何日、何ヶ月、何年も動作することを意味します。私が何をしても、メモリは徐々に割り当てられますが、解放されないという事実に直面しました。Instruments Leaks はメモリ リークがないことを示していますが、Instruments Allocations と Activity Monitor では、メモリが徐々に割り当てられ、どんどん大きくなっています。特にビデオを再生するときに発生する場所はたくさんあります。簡単な例 (Xcode 4.3、ARC なし):

ViewController.h

@interface ViewController : UIViewController
{
    MPMoviePlayerController *player;

}

ViewController.m

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    player = [[MPMoviePlayerController alloc] initWithContentURL:    [NSURL URLWithString:@"http://mysite.com/movie.mp4"]];

    player.view.frame = CGRectMake(400, 500, 360, 240);
    [self.view addSubview:player.view];
    player.controlStyle = MPMovieControlStyleNone;
    player.repeatMode = MPMovieRepeatModeOne;  
    [player play];
}

- (void)viewDidUnload
{
      [player stop];
      [player.view removeFromSuperview];
      [player release];
      [super viewDidUnload];
}

- (void)dealloc 
{
    [player release];
    [super dealloc];
}

このシンプルなアプリケーションは、ビデオ再生をループするだけです。3 分ごとに平均 100kb が割り当てられます。毎日 - 平均 40MB。Instruments Activity Monitor でプロファイリングしています。時間が経つにつれて、アプリは死にます。どうしたの?新しいオブジェクトを初期化せずにビデオ (ループ再生) を見るだけでメモリが増加するのはなぜですか?

4

1 に答える 1

0

入力ストリームのプリロードに使用されるキャッシュは、アプリが再度読み込まれるか閉じられた場合にのみ更新され、それ以外の場合はデータが蓄積され続けます。アプリを閉じて再度開くと、メモリ割り当てが存在します。基本的にはメモリリークではありません。

また、使用後にMPMoviePlayerController通知を削除する必要があります。また、playersオブジェクトを解放する必要があります。

そして、どこで[player.viewremoveFromSuperview]を使用していますか。

于 2012-05-12T05:54:19.387 に答える