0

我正在开发一个非常重的仅 iPad 的 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];


}
4

3 回答 3

2

我试过了

MPMoviePlayerController *movieController = [notification object];
[[NSNotificationCenter defaultCenter] removeObserver:self 
    name:MPMoviePlayerPlaybackDidFinishNotification 
    object:movieController];  
movieController = nil;

这似乎有效。

于 2012-07-06T03:28:17.680 回答
1

我遇到了这个问题,它让我发灰!每次实例化一个新视频时,它都不会发布(使用 ARC),并且随着更多的 viewController 实例被创建,它最终导致了一个笨拙的崩溃。我也检查了所有 MPMoviePlayer 调用,确保它已停止并设置为零。

问题不在于 MPMoviePlayerController 的分配和释放,而在于用于传递视图控制器详细信息的委托。在子视图控制器中,我有一个委托来检查从 tableViewController 传递的模型数据:

@property (strong, nonatomic) id<MyViewControllerDelegate> delegate;

作为强指针的赋值导致了巨大的内存泄漏。通过将其指定为“弱”,它解决了问题。

@property (weak, nonatomic) id<MyViewControllerDelegate> delegate;

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

祝你好运。希望这可以清除泄漏!

于 2013-05-30T20:28:27.363 回答
1

这是一种预感,但请尝试在 vidPlayer 被销毁之前调用 removeObserver 。文档指定您应该“确保在 notificationObserver 或 addObserver:selector:name:object: 中指定的任何对象被释放之前调用 removeObserver: 或 removeObserver:name:object:。” -- NSNotification 中心

此外,您可以尝试删除 viewDidLoad 中的显式自动释放池。如果每个视图只有一个 vidPlayer,则没有必要,并且最近发现了 ARC 和 autoreleasepools 的一些问题。看到这个错误修正

于 2012-04-16T18:01:13.237 回答