MPMoviePlayerController:内存使用率高(未解除分配)

时间:2010-08-19 07:24:13

标签: iphone memory-leaks memory-management mpmovieplayercontroller

我在我的iPhone应用程序中使用MPMoviePlayerController有时会显示一些短视频剪辑。我宣布了一个类别,该类别向该类广告了几种方法,以便将其视图正确附加到特定视图并从中删除它。 我使用通知系统让课程知道电影何时播放完毕,然后我尝试删除它。 以下是类别中的方法:

- (void)setViewInCurrentController{  
    LPAppDelegate * appDelegate = [[UIApplication sharedApplication] delegate];
    self.view.frame = CGRectMake(0, 0, 320, 480);
    self.view.alpha = 0.0;

    [appDelegate.window addSubview:self.view];
    [UIView beginAnimations:@"FadeIn" context:nil];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationBeginsFromCurrentState:YES];
    self.view.alpha = 1.0;
    [UIView commitAnimations];

}
- (void)removeViewInCurrentController{

    [UIView beginAnimations:@"FadeOut" context:nil];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationBeginsFromCurrentState:YES];
    self.view.alpha = 0.0;
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(removeFromSuperview)];
    [UIView commitAnimations];
} 

这是我使用MPMoviePlayer的地方:

- (void)playVideoNarration:(VideoNarration *)vNarr{
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] 
                                       initWithContentURL:[NSURL fileURLWithPath:vNarr.videoURI]];
    [[NSNotificationCenter defaultCenter] 
                             addObserver:self
                                selector:@selector(videoNarrationFinishedPlaying:)                                                 
                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                  object:player];

    [player setViewInCurrentController];
    player.controlStyle = MPMovieControlStyleNone;
    [player play]; 
}

- (void)videoNarrationFinishedPlaying:(NSNotification *) aNotification{

    MPMoviePlayerController * player = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:player];
    [player removeViewInCurrentController];
    [player release];
}

视频显示正确,然后播放器从视图中移除,我猜它也会被解除分配,但是当我使用Instruments Allocations Tool看到应用程序时,我看到分配的内存达到20多MB并且未被释放玩家完成后。 负责分配的是一个名为VideoToolBox的库。

除了一些名为AudioToolBox的库外,没有显示任何泄漏。对正在发生的事情的任何猜测?

1 个答案:

答案 0 :(得分:2)

该问题的解决方案似乎是这样的: 你必须在发布之前调用[player stop]。这看起来有点奇怪,因为我已经收到关于玩家完成比赛的通知。这样做会释放内存(只剩下一小部分,距离CoreMedia约100Kb,但我相信这是正常的