MPMoviePlayerController导致泄漏

时间:2012-04-16 17:27:03

标签: ios mpmovieplayercontroller automatic-ref-counting

我正在开发一个非常适合视频的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];


}

3 个答案:

答案 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;

作为一般规则,对于视图控制器委托,将它们指定为弱属性指针。

祝你好运。希望这可以解决泄漏问题!