【问题标题】:MPMoviePlayerController causing leakMPMoviePlayerController 导致泄漏
【发布时间】:2012-04-16 17:27:03
【问题描述】:

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


}

【问题讨论】:

  • 你能贴一张仪器结果的截图吗?

标签: ios mpmovieplayercontroller automatic-ref-counting


【解决方案1】:

我试过了

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

这似乎有效。

【讨论】:

    【解决方案2】:

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

    另外,您可以尝试删除 viewDidLoad 中的显式自动释放池。如果每个视图只有一个 vidPlayer,则没有必要,并且最近发现了 ARC 和 autoreleasepools 的一些问题。见this bugfix

    【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    祝你好运。希望这能消除泄漏!

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2014-06-07
      • 2013-11-20
      • 2011-10-28
      • 2016-01-18
      相关资源
      最近更新 更多