2015-07-02 33 views
14

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: Instruments check for Zombie objects

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

+0

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. –

+0

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. –

+0

Czy otworzyłeś radar o tym problemie? – Isaac

Odpowiedz

8

Hmm .. może mam na to rozwiązanie, po prostu spróbuj (działa już dla mnie - zrobił wiele testów)

Spróbuj tego: na MediaViewController dodaj/nadpisać viewDidDisappear metoda tak:

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

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

Jeśli to nie działa dodać go również w viewWillDisappear - pracował dla mnie.

+0

Dzięki. Czy masz jakiś pomysł, dlaczego zostałeś zwolniony? – rounak

+0

coś pójdzie nie tak podczas zwalniania kontrolki viewcontroller ... więc i tak jest to błąd .... – kurtanamo

1

Moja aplikacja działa poprawnie na ios8.3, ale pokazuje to nad- wydanie wydania na 8.4. Założę się, że coś zepsułem, dopóki nie przeczytałem twojego pytania. Próbowałem aplikacji na ios8.3

+0

Testowałem to jeszcze bardziej. Wydaje mi się, że mam problem z symulatorem, ale nie iPadem z systemem 8.4 – Jmf

+0

Mogę tylko potwierdzić - ale byłem pewien, że wypróbowałem go również na urządzeniu - nie ulega on awarii na moim iPadzie mini (iOS 8.4). Nadal nie jestem pewien, czy jest to "bezpieczne do wydania" z tym zestawem SDK ... –

+0

Podniesiono radar: 21701131 – Jmf