14

Erstellt ein sehr einfaches (Einzelansicht) Beispielprojekt aus einem Teil eines größeren. Es funktionierte mit dem iOS SDK 8.3.MPPoviePlayerController unter ARC im iOS SDK 8.4 auf dem iPad veröffentlicht

Wenn Sie auf die Schaltfläche "Show me" klicken, erscheint ein Video (als modal) und 2 Sekunden später verschwindet es. Sieht gut aus. Aber wenige Augenblicke später stürzt die App ab, weil eine -dealloc-Nachricht an ein bereits freigegebenes Objekt gesendet wird.

[MPAVController release]: Nachricht an deallokierten Instanz gesendet

Hier ist mein Beispielprojekt (nicht über die video.mp4 vergessen):

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 

Wenn ich die ARC ausschalten, die Bug ist noch am Leben (Hinzufügen -fno-objc-Bogen-Flag für die MediaViewController.m und Hinzufügen dieser Zeile

[movieController release]; 

nach der Eigenschaft zuweisen.

auch mit Instrumenten geprüft: Instruments check for Zombie objects

Das Problem tritt auf iPad (die ganze Zeit), aber es scheint nicht ein Problem auf dem iPhone.

Hat jemand dieses Problem konfrontiert?

(Wahrscheinlich eine Lösung: Laden Sie die iOS 8.3 SDK und machen Archiv mit, dass)

Cheers,

Adam

+0

Nachdem ich den Xcode 6.3.2 (mit iOS SDK 8.3) erneut heruntergeladen habe und einfach von ~/Downloads/... gelaufen bin, habe ich diesen Absturz bekommen. Nach dem Xcode 6.4 wurde gezippt (und die Quelle wurde gelöscht), die 6.3.2 zog an ihren Platz (/ Applications /) es funktionierte gut. –

+0

Ich sehe dieses Problem auch mit 8.4. Sogar mit Archiven, die aus xcode 6.3 erstellt wurden. Ich sehe das gleiche Problem in der ios-9.0 Beta. –

+0

Haben Sie ein Radar über dieses Problem geöffnet? – Isaac

Antwort

8

Hmm .. vielleicht habe ich eine Lösung dafür gefunden, versuche es einfach (es funktioniert schon für mich - habe viele Tests gemacht)

Try this: auf Ihrem MediaViewController Add/außer Kraft setzen viewDidDisappear Methode wie folgt:

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

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

Wenn es funktioniert es in viewWillDisappear auch nicht hinzufügen - für mich gearbeitet.

+0

Danke. Irgendeine Idee, warum es veröffentlicht wird? – rounak

+0

bei der Freigabe des Viewcontrollers passiert etwas schief ... also ist es sowieso ein Fehler .... – kurtanamo

1

Meine App funktioniert auf ios8.3 in Ordnung, aber zeigt dieses Über- Release-Problem am 8.4. Ich hatte angenommen, ich hätte etwas kaputt gemacht, bevor ich deine Frage gelesen habe. Ich probierte die App auf ios8.3

+0

Testen Sie dies noch mehr. Ich habe das Problem auf dem Simulator, aber nicht ein iPad mit 8.4 – Jmf

+0

Ich kann nur bestätigen - aber ich war mir sicher, dass ich es auch auf dem Gerät ausprobiert - es stürzt nicht auf meinem iPad mini (iOS 8.4). Immer noch nicht sicher, dass es mit diesem SDK "sicher freizugeben" ist ... –

+0

Erhob ein Radar: 21701131 – Jmf

Verwandte Themen