2009-07-24 4 views
1

Je me rends compte qu'une question similaire a déjà été postée, mais je n'arrive vraiment pas à trouver une solution qui fonctionne pour moi. J'ai une classe MoviePlayer qui stocke un Ivar de MPMoviePlayerController, et je la méthode suivante dans la classe:MPMoviePlayerController jouera une fois, puis enverra une erreur

-(void)playMovie:(NSString *)movieName 
{ 
    NSURL *movieURL; 
    NSBundle *bundle = [NSBundle mainBundle]; 
    if(bundle) 
    { 
     NSString *moviePath = [bundle pathForResource:movieName ofType:@"m4v"]; 
     if(moviePath) 
     { 
      movieURL = [NSURL fileURLWithPath:moviePath]; 
     } 
    } 
    MPMovieController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
    if(mp) 
    { 
     self.moviePlayer = mp; 
     [mp release]; 

     [self.moviePlayer play]; 
    } 
    [movieURL release]; 
} 

Quand appel que je joue film une fois que le film joue bien, mais quand il est appelé à nouveau sur un autre (ou le même) film fichier je reçois la pile d'erreur suivante:

_class_isInitialized 
_class_lookupMethodAndLoadCache objc_msgSend 
-[MoviePlayer setMoviePlayer:] 
-[MoviePlayer playMovie:] 

Je ne sais pas comment y remédier! J'ai supposé que quand self.moviePlayer = mp est appelé alors le moviePlayer actuel est libéré et le nouveau est ajouté? La propriété est définie sur (nonatomic, retain). Quelqu'un peut-il aider s'il vous plaît?

Merci

Répondre

1

Vous avez lancé le lecteur vidéo. Donc, il a été désaffecté.

Il semble que vous l'ayez publié ailleurs dans votre code, probablement dans la méthode de rappel. Cherchez juste chaque fois que vous l'avez utilisé. MoviePlayer pointe maintenant vers la poubelle. Ainsi, lorsque vous essayez de créer un nouveau MoviePlayer, l'accesseur de votre propriété tente d'envoyer un message de libération à la poubelle stockée dans moviePlayer.

Si vous souhaitez libérer moviePlayer entre plusieurs utilisations, ne le libérez pas, mais réglez-le à zéro.

[self setMoviePlayer:nil]; 

Ensuite, lorsque vous essayez d'en créer un, vous ne communiquerez pas avec les ordures.

+0

Hey, merci pour la réponse. J'ai essayé votre suggestion et j'obtiens une pile d'erreurs avec la méthode NSPopAutoreleasePool> [MPMoviePlayer Controller dealloc]. Je n'ai jamais libéré le MPMoviePlayerController dans mon code, j'ai parcouru chaque ligne juste pour le vérifier. Les MPMoviePlayerControllers sont-ils automatiquement ajoutés au pool? –

+0

Si vous avez la pile, alors vous devriez voir où le lecteur de film a été libéré (j'espère). Non, vous avez utilisé init, il est donc de votre responsabilité de le libérer (gestion de la mémoire cacao). Vous devrez effectuer un suivi lorsque vous relâchez le lecteur. Vous pouvez également créer une catégorie pour MPMoviePlayer, puis implémenter la méthode de publication. Placez un point d'arrêt dans cette méthode et découvrez quand il est appelé. –

1

J'ai résolu ce problème. Il s'avère que ce code était le problème:

movieURL = [NSURL fileURLWithPath: moviePath];

Le NSURL était auto-libéré trop tôt pour une raison quelconque. Si j'ai alloué la mémoire pour cela et l'ai libéré moi-même, le problème s'est arrêté. Espère que cela aidera d'autres personnes.

Stu

Questions connexes