我正在开发一个非常适合视频的iOS应用程序,它使用ARC但是当我尝试使用MPMoviePlayerController时,我似乎有泄漏,仪器在为视频播放器对象分配内存的代码行上抛出内存泄漏, 有任何想法吗?当视频完成播放时,视频播放器的清理似乎也不会发生。
任何帮助都会非常感激,一直在寻找答案,因为你可以说这个问题非常适合应用程序的性质。
代码:
@interface ViewController ()
@property(nonatomic,strong) MPMoviePlayerController * vidPlayer;
@end
@implementation ViewController
@synthesize vidPlayer;
- (void)viewDidLoad
{
@autoreleasepool {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self playVideoForFile:@"01_intro"];
}
}
-(void)playVideoForFile:(NSString*)p_fileName
{
NSString *path = [[NSBundle mainBundle] pathForResource:p_fileName ofType:@"mp4"];
NSURL *tempURI = [NSURL fileURLWithPath:path];
vidPlayer = [[MPMoviePlayerController alloc] initWithContentURL:tempURI];
[vidPlayer setControlStyle:MPMovieControlStyleNone];
[vidPlayer setAllowsAirPlay:NO];
[vidPlayer.view setFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.height,[[UIScreen mainScreen] bounds].size.width)];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(vidFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:vidPlayer];
[vidPlayer play];
[self.view addSubview:vidPlayer.view];
}
-(void)vidFinishedCallback:(NSNotification*)aNotification
{
[vidPlayer pause];
vidPlayer.initialPlaybackTime = -1;
[vidPlayer stop];
vidPlayer.initialPlaybackTime = -1;
[vidPlayer.view removeFromSuperview];
vidPlayer = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:vidPlayer];
}
答案 0 :(得分:1)
这是预感,但尝试在 vidPlayer销毁之前调用removeObserver 。文档指定您应该“确保调用removeObserver:或removeObserver:name:object:before notificationObserver或addObserver中指定的任何对象:selector:name:object:is deallocated。” - NSNotification Center
此外,您可以尝试删除viewDidLoad中的显式自动释放池。如果每个视图只有一个vidPlayer,那么它就没有必要了,并且最近发现了ARC和autoreleasepools的一些问题。见this bugfix
答案 1 :(得分:1)
我试过
MPMoviePlayerController *movieController = [notification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:movieController];
movieController = nil;
这似乎有效。
答案 2 :(得分:1)
我遇到了这个问题,它让我变灰了!每次实例化一个新视频时,它都不会被释放(使用ARC),并且随着viewController的更多实例被创建,它最终导致了一个笨重的崩溃。 我也检查了所有MPMoviePlayer调用,确保它已经停止并设置为nil。
问题不在于MPMoviePlayerController的分配和释放,而是在用于传递视图控制器详细信息的委托中。 在子视图控制器中,我有一个委托来检查tableViewController传递的模型数据:
@property (strong, nonatomic) id<MyViewControllerDelegate> delegate;
作为强指针的赋值导致了巨大的内存泄漏。通过将其指定为“弱”,它可以解决问题。
@property (weak, nonatomic) id<MyViewControllerDelegate> delegate;
作为一般规则,对于视图控制器委托,将它们指定为弱属性指针。
祝你好运。希望这可以解决泄漏问题!