我的电影播放器仅在iPad上泄漏内存,并且仅在单击“完成”按钮时才会泄漏内存。如果电影播放完毕,那么它会正常清理。这是播放代码:
mViewPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[self movieURL:@"mymovie"]];
[self.parentViewController presentModalViewController:mViewPlayer animated:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerPlaybackDidFinishNotification object:[mViewPlayer moviePlayer]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[mViewPlayer moviePlayer]];
这是清理代码:
- (void)exitedFullscreen:(NSNotification*)aNotification
{
MPMoviePlayerController *player = [aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:player];
[self.parentViewController dismissModalViewControllerAnimated:YES];
NSLog(@"retainCount theMovie: %i", [mViewPlayer retainCount]);
player.initialPlaybackTime = -1;
[player pause];
[player stop];
NSLog(@"retainCount theMovie: %i", [mViewPlayer retainCount]);
[player release];
player = nil;
// [mViewPlayer release];
mViewPlayer = nil;
}
retainCount在上面打印时都是3次,当电影正常完成或单击“完成”按钮时,它是相同的。
我也尝试过使用MPMoviePlayerController并获得相同的结果。我已经尝试使用准备好的播放和10种不同的方法来调用MPMoviePlayer *控制器,但是当我点击完成按钮时它总是会泄漏。
非常感谢任何帮助。感谢。
答案 0 :(得分:0)
删除观察者时,MPMoviePlayer实例已保留并自动释放。使用autorelease包装remove observer代码将使retainCount与预期一致。
像这样:
// remove all observers
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // following messages adds to autorelease pool
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:player];
[pool drain], pool = nil;
答案 1 :(得分:0)
您忘了将moviePlayer发布到init附近。你可以这样做:
mViewPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[self movieURL:@"mymovie"]];
[self.parentViewController presentModalViewController:mViewPlayer animated:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerPlaybackDidFinishNotification object:[mViewPlayer moviePlayer]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[mViewPlayer moviePlayer]];
[mViewPlayer release];
答案 2 :(得分:0)
我有同样的问题。为了在没有内存泄漏的情况下阻止它,我必须快进到最后几秒,以便它可以自己完成。
但后来我发现这个泄漏只发生在iPad模拟器上。如果你在设备上运行它就没问题。