Search code examples
iphoneiosxcodempmovieplayercontrolleruialertview

crash after UIAlertViewDelegate's clickedButtonAtIndex with message [MPMoviePlayerViewController isKindOfClass:]: message sent to deallocated instance


I just want to dismiss UIAlertView but I can't with a strange bug for some days...

After tapping cancel button on UIAlertView, Codes below works.

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{
    [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES];
}

But After passing these lines, it makes crash with message below:

[MPMoviePlayerViewController isKindOfClass:]: message sent to deallocated instance 0x27f590

On the same view, I embed

MPMoviePlayerViewController.moviePlayer.view
[self.view addSubview:vc.moviePlayer.view];

Does Anybody know what happend? I use ARC, iOS5.1. If you need more information, I do add them.

Thank you in advance.

more info:

I set breakpoints on all methods in my code. And I made sure that it crashes after clickedButtonAtIndex...

codes for calling UIAlertView show are

-(void)applicationDidBecomeActive:(NSNotification *)notification
{
    self.alert = hoge; // set delegate = self
    [self.alert show];
}

after calling them, viewDidAppear's called. There are codes for enbedding vc.moviePlayer.view like

MPMoviePlayerViewController *vc;
vc = [[MPMoviePlayerViewController alloc] initWithContentURL:hogeURL];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(finishPreload:)
                                             name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                           object:vc];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(finishPlayback:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:vc];

vc.view.frame = CGRectMake( 0, 0, 320, 440);

vc.moviePlayer.allowsAirPlay = YES;
vc.moviePlayer.shouldAutoplay = NO;
vc.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
vc.moviePlayer.useApplicationAudioSession = NO;

[vc.moviePlayer.view setTag:310];

[self.view addSubview:vc.moviePlayer.view];

My app has 3 tabs, 2 of them's embed MPMoviePlayerViewController.moviePlayer.view. Method called in the other tabs's controller are viewWillDisappear and viewDidDisappear only.


Solution

  • It seems to me that your MPMoviePlayerController instance is deallocated after viewDidAppear. I think you should set vc as a property or instance variable of the View Controller so that it persists throughout the lifetime of the View Controller.