使用 MPMoviePlayerController 时的内存泄漏

Posted

技术标签:

【中文标题】使用 MPMoviePlayerController 时的内存泄漏【英文标题】:Memory Leak in using MPMoviePlayerController 【发布时间】:2013-10-22 10:54:22 【问题描述】:

在我的项目中,我手动创建视图而不使用情节提要。当我点击图像时,我尝试播放视频。它工作正常。但是每次当我检查它时点击图像时都会显示内存泄漏,我已经搜索了很多并应用了但没有用。 在我的 Appdelegate.h 文件中:

@property (strong, nonatomic) MPMoviePlayerController *theMoviePlayer;
@property (strong, nonatomic) UIImageView *image1;

在.m文件中:

-(void) startPage
.....
_image1 = [[UIImageView alloc] initWithFrame:CGRectMake((self.window.frame.size.width/2)-25, 40, 50, 50)];
[_image1 setUserInteractionEnabled:YES];
_image1.image = [UIImage imageNamed:@"image_2.jpg"];
_tapImage1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(image1Tapped:)];
[_image1 addGestureRecognizer:_tapImage1];
.....

在 imageTapped() 中,

-(void) image1Tapped:(UITapGestureRecognizer *)sender

  .....

 [_image1 removeFromSuperview];

 _theMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];


    [_theMoviePlayer setControlStyle:MPMovieControlStyleFullscreen];

    [_theMoviePlayer.view setFrame:CGRectMake(0,-55, self.window.frame.size.width, self.window.frame.size.height)];



    [_theMoviePlayer setScalingMode:MPMovieScalingModeAspectFill];

    UIWindow *backgroundWindow = [[UIApplication sharedApplication] keyWindow];

    [backgroundWindow addSubview:_theMoviePlayer.view];

    [_theMoviePlayer.view bringSubviewToFront:backgroundWindow];
[_theMoviePlayer play];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinished:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification object:_theMoviePlayer];
...

每次进入 imageTapped: 方法时都会发生内存泄漏。任何帮助将不胜感激。

【问题讨论】:

通知完成后你会移除观察者吗? 是的,我做到了。但是没有发生泄漏,它在进入我提到的 imageTapped: 方法时开始。 【参考方案1】:
@property (strong, nonatomic) MPMoviePlayerController *theMoviePlayer;
@property (weak, nonatomic) UIImageView *image1;

另一个想法是你的theMoviePlayer 没有被删除,尝试使其视图透明,看看是否已经在新的后面工作

【讨论】:

你也这样做了,我在应用加载时看不到我的图像,它在显示之前就被释放了。 如果您删除的图像与您发布的图像不同,您是否在仪器中检查过? 那么如何发布。我在 Instrument 工具中检查了泄漏,它显示泄漏起始表单 '[MPMoviePlayerController setControlStyle:]' 行。 你在movieFinished:方法中做了什么? 这就是我所做的 'MPMoviePlayerController* theMovie = [annotification object]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie];[_theMoviePlayer stop]; _theMoviePlayer.initialPlaybackTime = -1; [_theMoviePlayer.view removeFromSuperview];'【参考方案2】:

我想帮你。

在 -(void) startPage 中分配 _image1 对象

您正在删除方法 -(void) image1Tapped:(UITapGestureRecognizer*)sender 中的对象 使用 [_image1 removeFromSuperview]; 方法

表示现在 _image1 为 nil 并且当 -(void) image1Tapped:(UITapGestureRecognizer *)sender 方法在您获取 _image1 对象时调用当时 _image1 已经为 nil 所以它会给出内存泄漏警告。

这个解决方案是:

1.**显示/隐藏_image1对象**或 每次您需要根据您的要求在此方法 -(void) image1Tapped:(UITapGestureRecognizer *)sender 中进行适当的分配和删除 image1 对象时。

首先尝试这个解决方案,内存泄漏警告会被移除。

编译器会提前检查所有步骤,以便将其识别为警告。

在某些情况下,如果您的逻辑错误,那么编译器会通知我们错误的逻辑。

如果您想检查是否单击了内存警告按钮的蓝色箭头,它将解释您的逻辑或带有假设的警告。

【讨论】:

是的,谢谢,但我在这里重用视图以防止内存泄漏,所以我在 startPage() 方法中分配了我的视图 imageView,然后在 image1Tapped() 方法中删除了我的视图和 imageView为我的视频播放分配了一个新视图。我没有在我的问题中提到这一点,因为我已经检查过没有播放我的视频,它显示没有泄漏。 也试过了。。没用。【参考方案3】:

我发现了问题,它与设备 iPad(ios 版本 5)有关。当我使用 iPad4(iOS 版本 7)检查时,它显示没有泄漏。

【讨论】:

以上是关于使用 MPMoviePlayerController 时的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”