在iPad上的iOS SDK 8.4中的ARC下过度发布了MPMoviePlayerController

Ada*_*abo 14 sdk mpmovieplayercontroller ipad ios automatic-ref-counting

从较大的一部分创建了一个非常简单(单一视图)的示例项目.它适用于iOS SDK 8.3.

当您点击"显示我"按钮时,视频会出现(作为模态),2秒后,它会消失.看起来不错.但不久之后,应用程序崩溃了,因为-dealloc消息被发送到已经解除分配的对象.

[MPAVController release]:发送给deallocated实例的消息

这是我的示例项目(不要忘记Video.mp4):

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end
Run Code Online (Sandbox Code Playgroud)

ViewController.m

#import "ViewController.h"

#import "MediaViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button setTitle:@"Show me!" forState:UIControlStateNormal];
    button.frame = CGRectMake(10.0, 10.0, 100.0, 30.0);
    [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

- (void)buttonTapped:(id)sender
{
    MediaViewController *mediaVC = [[MediaViewController alloc] initWithNibName:nil bundle:nil];
    [self presentViewController:mediaVC animated:YES completion:^{
        [self performSelector:@selector(dismissPresentedController) withObject:nil afterDelay:2.0];
    }];
}

- (void)dismissPresentedController
{
    [self.presentedViewController dismissViewControllerAnimated:YES completion:nil];
}

@end
Run Code Online (Sandbox Code Playgroud)

MediaViewController.h

#import <UIKit/UIKit.h>

@interface MediaViewController : UIViewController

@end
Run Code Online (Sandbox Code Playgroud)

MediaViewController.m

#import "MediaViewController.h"

#import <MediaPlayer/MediaPlayer.h>

@interface MediaViewController ()

@property (nonatomic) MPMoviePlayerController *movieController;

@end

@implementation MediaViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    MPMoviePlayerController *movieController = [[MPMoviePlayerController alloc] initWithContentURL:[[NSBundle mainBundle] URLForResource:@"Video" withExtension:@"mp4"]];
    movieController.repeatMode = MPMovieRepeatModeOne;
    movieController.controlStyle = MPMovieControlStyleNone;
    movieController.scalingMode = MPMovieScalingModeAspectFill;
    [movieController prepareToPlay];
    self.movieController = movieController;

    UIView *movieView = movieController.view;
    movieView.frame = CGRectZero;
    movieView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view insertSubview:movieView atIndex:0];

    // Autolayout

    NSDictionary *layoutNeededViews = NSDictionaryOfVariableBindings(movieView);

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[movieView]|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:layoutNeededViews]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[movieView]|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:layoutNeededViews]];
}

@end
Run Code Online (Sandbox Code Playgroud)

如果我关闭ARC,则该bug仍然存在(为MediaViewController.m添加-fno-objc-arc标志并添加此行

[movieController release];
Run Code Online (Sandbox Code Playgroud)

财产分配后.

还用仪器检查: 仪器检查Zombie对象

问题出现在iPad上(所有时间),但在iPhone上似乎不是问题.

有人遇到过这个问题吗?

(可能是一个解决方案:下载iOS 8.3 SDK并使用它进行存档)

干杯,

亚当

kur*_*amo 8

嗯..也许我得到了一个修复,只是尝试它(它已经适合我 - 做了很多测试)

试试这个:在你的MediaViewController添加/覆盖viewDidDisappear方法上,像这样:

   func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)

        //just a small fix for error on iPad iOS8.4
        self.movieController.stop()
    }
Run Code Online (Sandbox Code Playgroud)

如果它不起作用也加入它 viewWillDisappear- 为我工作.