内存泄漏使用MPMoviePlayerController

时间:2013-10-22 10:54:22

标签: ios objective-c memory-leaks mpmovieplayercontroller xcode5

在我的项目中,我手动创建视图而不使用故事板。我点按图片时尝试播放视频。它工作正常。但每当我检查它显示内存泄漏时,我点击图像,我已经搜索了很多,并应用但没有用。  在我的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:方法时都会出现内存泄漏。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

另一种想法是,您的theMoviePlayer未被删除,请尝试使其视图透明,看看是否已经在新版本后面工作

答案 1 :(得分:1)

我想帮助你。

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

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

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

这个问题的解决方案是:

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

首先尝试此解决方案,并删除内存泄漏警告。

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

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

如果您想检查点击内存警告按钮的蓝色箭头,它会假设出现您的逻辑或警告。

答案 2 :(得分:1)

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