Overreleased MPMoviePlayerController под ARC в iOS SDK 8.4 на iPad

Создал очень простой (один вид) образец проекта из части более крупного. Он работал с SDK для iOS 8.3.

Когда вы нажмете кнопку "Показать меня", видео появится (как модальное) и через 2 секунды оно исчезнет. Выглядит неплохо. Но несколько мгновений спустя приложение вылетает из-за того, что сообщение -dealloc отправляется на уже освобожденный объект.

[Отпуск MPAVController]: сообщение отправлено на освобожденный экземпляр

Вот мой пример проекта (не забывайте о Video.mp4):

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end

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

MediaViewController.h

#import <UIKit/UIKit.h>

@interface MediaViewController : UIViewController

@end

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

Если я выключу ARC, ошибка все еще жива (добавление флага -fno-objc-arc для MediaViewController.m и добавление этой строки

[movieController release];

после присвоения свойства.

Также проверяется с помощью инструментов: Instruments check for Zombie objects

Проблема возникает на iPad (все время), но это не проблема на iPhone.

Кто-нибудь столкнулся с этой проблемой?

(Возможно, решение: загрузите SDK iOS 8.3 и сделайте с ним архив)

Приветствия,

Адам

Ответы

Ответ 1

Хм.. может быть, я исправился, просто попробуй (он уже работает для меня - сделал много тестов)

Попробуйте следующее: В вашем методе MediaViewController add/override viewDidDisappear выполните следующие действия:

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

        //just a small fix for error on iPad iOS8.4
        self.movieController.stop()
    }

Если он не работает, добавьте его и в viewWillDisappear - работал у меня.

Ответ 2

Мое приложение отлично работает на ios8.3, но показывает эту проблему с выпуском 8.4. Я предположил, что сломал что-то, пока не прочитал ваш вопрос, который я попробовал использовать на ios8.3.