Mitch
Mitch

Reputation: 99

When my movie is finished to play, the app crashes

I tried to launch a movie by clicking in a button. When I click the Movie player appears and works fine. The movie plays until the end and the Movie player disappears. After it disappears, my app crashes...

I use my View Controller in Tab Bar Application with this code :

- (void)moviePlayBackDidFinish:(NSNotification *) aNotification{

    MPMoviePlayerController *player = [aNotification object];
    [player setFullscreen:NO animated:YES];
    [player.view removeFromSuperview];
    [player stop];
    player.initialPlaybackTime = -1.0;
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
    [player release];
    player=nil;
}

- (IBAction)playVideo:(UIButton *)playButton{
    NSString *url = [[NSBundle mainBundle] pathForResource:@"Teaser 04" ofType:@"mov"];
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:url]];
    player.shouldAutoplay = YES;
    player.view.frame = CGRectMake(0., 44., self.view.bounds.size.width, self.view.bounds.size.height-44);
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:player];
    [self.view addSubview:player.view];
    [player play];
}

I don't know what I'm doing wrong. I just want configure a button that start the video and when the video is finished, the MoviePlayer View disappears and the app come back to my initial .xib

Thank you for your help

Upvotes: 2

Views: 1295

Answers (2)

Mitch
Mitch

Reputation: 99

I found the solution, I don't know if it is the best but for what I want it's working :

- (void)movieFinishedCallBack:(NSNotification *) aNotification{
MPMoviePlayerController *player = [aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
[player.view removeFromSuperview];
[player stop];
[player release];

}

- (IBAction)playVideo:(UIButton *)playButton{
NSString *url = [[NSBundle mainBundle] pathForResource:@"Teaser 04" ofType:@"mov"];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:url]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallBack:) name:MPMoviePlayerPlaybackDidFinishNotification object:player];
player.view.frame = CGRectMake(0, 0, 950, 600);
[self.view addSubview:player.view];
[player play];

}

Upvotes: 1

Joshua Pokotilow
Joshua Pokotilow

Reputation: 1233

I could be wrong, but my guess is that the player gets used somewhere in the backtrace for the call to moviePlayBackDidFinish: ... If I'm right, then deallocing the object there - which it looks like you're doing - is bad news, since the object is still needed somewhere up in the stack.

Check out this post for more details: How to release MPMoviePlayerController?

Upvotes: 0

Related Questions