2009-07-24 4 views
1

Ich merke, dass eine ähnliche Frage vorher gepostet wurde, aber ich kann wirklich nicht scheinen, eine Lösung zu finden, die für mich funktioniert. Ich habe einen Movieplayer-Klasse, die eine Ivar von MPMoviePlayerController speichert, und ich habe die folgende Methode in der Klasse:MPMoviePlayerController wird einmal abgespielt, dann einen Fehler werfen

-(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]; 
} 

Wenn Anruf Ich spiele Film einmal der Film fein spielt, aber wenn es aufgerufen wird, wieder auf einem anderen (oder die gleiche) Filmdatei Ich bekomme folgenden Fehler-Stack:

Ich bin mir nicht sicher, wie ich es beheben soll! Ich nahm an, dass, wenn self.moviePlayer = mp aufgerufen wird, der aktuelle moviePlayer veröffentlicht wird und der neue hinzugefügt wird? Die Eigenschaft ist auf (nicht atomisch, beibehalten) festgelegt. Kann mir bitte jemand helfen?

Dank

Antwort

1

Sie haben den Film-Player freigegeben. Also wurde es freigegeben.

Es scheint, Sie haben es an anderer Stelle in Ihrem Code freigegeben, wahrscheinlich in der Rückrufmethode. Suche einfach nach jeder Instanz, in der du es benutzt hast.

moviePlayer zeigt jetzt auf Müll. Wenn Sie also versuchen, einen neuen moviePlayer zu erstellen, versucht Ihr Eigenschaftenaccessor, eine Veröffentlichungsmeldung an den in moviePlayer gespeicherten müll zu senden.

Wenn Sie den moviePlayer zwischen den Anwendungen freigeben möchten, heben Sie die Zuweisung nicht auf, sondern setzen Sie ihn auf null.

[self setMoviePlayer:nil]; 

Dann, wenn Sie versuchen, einen erstellen werden Sie nicht zu Müll Messaging werden.

+0

Hey, danke für die Antwort. Ich habe Ihren Vorschlag ausprobiert und erhalte einen Fehler-Stack mit der Methode NSPopAutoreleasePool> [MPMoviePlayer Controller dealloc]. Ich habe den MPMoviePlayerController in meinem Code nie wieder freigegeben. Ich habe jede Zeile durchsucht, nur um sie zu überprüfen. Werden MPMoviePlayerControllers automatisch zum Pool hinzugefügt? –

+0

Wenn Sie den Stapel haben, dann sollten Sie sehen, wo der Film-Player veröffentlicht wurde (hoffentlich). Nein, Sie haben init verwendet, es liegt also in Ihrer Verantwortung, es freizugeben (Kakao-Speicherverwaltung). Sie müssen aufspüren, wenn Sie den Player freigeben. Sie können auch eine Kategorie für MPMoviePlayer erstellen und dann die Veröffentlichungsmethode implementieren. Platziere einen Breakpoint in dieser Methode und finde heraus wann er aufgerufen wird. –

1

Ich habe dieses Problem behoben. Stellt sich heraus, dass dieser Code das Problem war:

movieURL = [NSURL fileURLWithPath: moviePath];

Die NSURL wurde aus irgendeinem Grund zu früh freigegeben. Wenn ich den Speicher dafür zugewiesen und es selbst freigegeben habe, dann ist das Problem nicht mehr aufgetreten.

Hoffnungen das hilft anderen Menschen.

Stu

Verwandte Themen