私は、理論的には無期限に機能するはずのプロジェクトを行ってきました。これは、プログラムを開始し、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 でプロファイリングしています。時間が経つにつれて、アプリは死にます。どうしたの?新しいオブジェクトを初期化せずにビデオ (ループ再生) を見るだけでメモリが増加するのはなぜですか?