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.