Utworzono bardzo prosty (pojedynczy widok) przykładowy projekt z części większego projektu. Działa z pakietem SDK iOS 8.3.Overreleased MPMoviePlayerController pod ARC w pakiecie SDK systemu iOS 8.4 na iPadzie
Po naciśnięciu przycisku "Pokaż", wideo pojawia się (jako modalne) i 2 sekundy później znika. Wygląda dobrze. Ale kilka chwil później aplikacja ulega awarii, ponieważ wiadomość -dealloc jest wysyłana do już zwolnionego obiektu.
[MPAVController release]: Komunikat wysłany do dealokowane przykład
Oto mój przykładowy projekt (nie zapomnij o 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
Gdybym wyłączyć ARC, błąd jest nadal żywy (dodawanie -fno-objc łukowego flag dla MediaViewController.m i dodanie tej linii:
[movieController release];
po przypisaniu właściwości.
sprawdzone także z instrumentami:
Ten problem występuje na iPad (cały czas), ale nie wydaje się problem na iPhone.
Czy ktoś napotkał ten problem?
(Prawdopodobnie rozwiązanie: pobierz iOS 8.3 SDK i zrobić z tym archiwum)
Cheers,
Adama
Po tym, jak ponownie pobrałem Xcode 6.3.2 (z iOS SDK 8.3) i właśnie pobiegłem z ~/Downloads/... Po Xcode 6.4 zostało spakowane (i źródło zostało usunięte), 6.3.2 przeniesione do jego miejsca (/ Applications /) działało dobrze. –
Też widzę ten problem z 8.4. Nawet przy użyciu archiwów zbudowanych z xcode 6.3. Widzę ten sam problem w wersji beta ios-9.0. –
Czy otworzyłeś radar o tym problemie? – Isaac