使用 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)和不使用它有啥区别?