2012-03-01 3 views
0

Eh bien, je suis en train de concevoir une application iPhone qui va lire la vidéo localement. Lorsque je clique sur le bouton dans le simulateur, il joue parfaitement, mais quand il s'arrête ou quand je le termine manuellement, il plante et continue à me donner ce problème .. J'ai essayé de nettoyer, construire, analyser et relancer mais toujours pareil. De l'aide?iphone ios xcode 4.2 - signal EXC_BAD_ACCESS

Mon code est que:

MoviePlayerViewController.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 
#import <MediaPlayer/MediaPlayer.h> 

@interface MoviePlayerViewController : UIViewController { 

} 
-(IBAction)playMovie:(id)sender; 
@end 

et le bit principal MoviePlayerViewController.m

- (IBAction)playMovie:(id)sender { 
    NSString *movpath = [[NSBundle mainBundle] pathForResource:@"think" ofType:@"mp4"]; 
    MPMoviePlayerViewController *mpviewController = [[MPMoviePlayerViewController alloc] 
                initWithContentURL:[NSURL fileURLWithPath:movpath]]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinishedCallback:) 
               name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

    [self.view addSubview:mpviewController.view]; 
    MPMoviePlayerController *mp = [mpviewController moviePlayer]; 
    [mp prepareToPlay]; 
    mp.scalingMode=MPMovieScalingModeAspectFill; 
    [[mpviewController moviePlayer] play]; 
} 

- (void)playbackFinishedCallback:(NSNotification *)notification { 
    MPMoviePlayerViewController *mpviewController = [notification object]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:mpviewController]; 
    [mpviewController.view removeFromSuperview]; 
    [mpviewController release]; 
} 
+0

Exécutez votre application en utilisant les zombies instrument. Il vous dira exactement quel est le problème. – edc1591

+0

Comment? Dans le nouveau xcode est assez différent. Je l'ai cherché mais je ne l'ai pas encore trouvé .. –

+0

Si vous allez dans les paramètres de votre système, il ya une case à cocher pour les zombies. Les objets zombies auxquels vous essayez d'accéder seront imprimés dans le journal. Ensuite, vous pouvez voir ce qu'ils sont et les corriger :) –

Répondre

0

Avez-vous essayé de faire le contrôleur de lecteur vidéo na Ivar

#import <UIKit/UIKit.h> 
    #import <Foundation/Foundation.h> 
    #import <MediaPlayer/MediaPlayer.h> 

    @interface MoviePlayerViewController : UIViewController { 

    } 

    @property (nonatomic, retain) MPMoviePlayerViewController *mpviewController; 

    -(IBAction)playMovie:(id)sender; 
    @end 

Ensuite, vous pouvez faire quelque chose comme ceci dans le fichier de mise en œuvre

@synthesize mpviewController; 

    - (IBAction)playMovie:(id)sender { 
     NSString *movpath = [[NSBundle mainBundle] pathForResource:@"think" ofType:@"mp4"]; 
     MPMoviePlayerViewController *mpController = [[MPMoviePlayerViewController alloc] 
                 initWithContentURL:[NSURL fileURLWithPath:movpath]]; 

     self.mpviewController = mpController; 
     [mpController release];            

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinishedCallback:) 
                name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

     [self.view addSubview:self.mpviewController.view]; 
     MPMoviePlayerController *mp = [self.mpviewController moviePlayer]; 
     [mp prepareToPlay]; 
     mp.scalingMode=MPMovieScalingModeAspectFill; 
     [[self.mpviewController moviePlayer] play]; 
    } 

    - (void)playbackFinishedCallback:(NSNotification *)notification { 

     [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:mpviewController]; 
     [mpviewController.view removeFromSuperview]; 
    } 

    - (void)viewDidUnload { 
    self.mpviewController = nil; 
    } 

    - (void)dealloc{ 
    self.mpviewController = nil; 

    [super dealloc]; 
    } 
+0

acclamations homme c'est la meilleure façon !!! Merci! –

1

Il y a quelques problèmes dans le code, voici les correctifs :

1> Supprimer [mpviewController release]; car il est cr en utilisant une méthode qui renvoie l'objet *autorelease* ([notification object]). Pour libérer l'objet mpviewController, déclarez-le comme variable d'instance et relâchez-le pour le rendre nul.

if(mpviewController != nil) 
{ 
[mpviewController release]; 
mpviewController = nil; 
} 

2> Comme vous l'avez déclaré mpviewController comme variable d'instance, il n'y a pas besoin d'accéder à la variable mpviewController via [notification object] parce que son pas là que vous n'avez pas fourni lorsque vous ajoutez observateur au centre de notification.

3> Remplacer la ligne de code suivante:

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:mpviewController]; 

avec

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

Explaination: Lorsque vous observateur ajoutez vous ne fournissez pas des informations d'objet, mais au moment de l'enlèvement, vous

Alors maintenant votre code deviendra:

- (void)playbackFinishedCallback:(NSNotification *)notification { 

    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 
    [mpviewController.view removeFromSuperview]; 
    if(mpviewController != nil) 
    { 
     [mpviewController release]; 
     mpviewController = nil; 
    } 
} 

En outre, dans - (void) dealloc de ce contrôleur, vous devez écrire un code similaire pour libérer mpviewController.

Merci,

+0

J'ai essayé cela, mais ensuite il ne reconnaît pas le mpviewController .. Je l'ai déclaré sans erreurs, mais il continue à s'écraser et me donner la même erreur .. –

+0

S'il vous plaît signaler les erreurs et le journal des accidents. – Ravin