2009-10-10 9 views

Antwort

17

MPMoviePlayerController ist ein Singleton unter der Haube. Wenn Sie das Objekt (ObjC) oder Dispose() 'd (MonoTouch) nicht ordnungsgemäß freigegeben haben und eine zweite Instanz erstellen, wird es entweder nicht wiedergegeben oder nur wiedergegeben.

Zusätzlich, wenn Sie zu MPMoviePlayerScalingModeDidChangeNotification oder MPMoviePlayerPlaybackDidFinishNotification oder MPMoviePlayerContentPreloadDidFinishNotification abonnieren, davor gewarnt, dass der entsandte NSNotification zum MPMoviePlayerController eine Referenz nimmt als gut, so, wenn Sie es halten um, werden Sie einen Verweis auf die Spieler haben.

Obwohl der Garbage Collector von Mono irgendwann kick-in ist, ist dies ein Fall, in dem deterministische Terminierung gewünscht ist (Sie wollen die Referenz jetzt, nicht gegangen, wenn der GC beschließt, eine Sammlung durchzuführen).

Aus diesem Grund möchten Sie die Dispose() - Methode auf dem Controller und die Dispose() -Methode für die Benachrichtigung aufrufen.

Zum Beispiel:

// Deterministic termination, do not wait for the GC 
if (moviePlayer != null){ 
    moviePlayer.Dispose() 
    moviePlayer = null; 
} 

Wenn Sie Benachrichtigungen zuhörten, rufen Sie Dispose in Ihren Benachrichtigungs-Handler am Ende, den Verweis freizugeben, als es zu einem MPMoviePlayerController zum Beispiel hält:

var center = NSNotificationCenter.DefaultCenter; 
center.AddObserver (
    "MPMoviePlayerPlaybackDidFinishNotification"), 
    (notify) => { Console.WriteLine ("Done!"); notify.Dispose(); }); 
0

Das Geheimnis liegt in der endPlay mit der Einstellung: moviePlayer.initialPlaybackTime = -1; bevor es freigegeben wird. Probieren Sie es aus: :)

-(void)playMovie:(NSString *)urlString{ 
    movieURL = [NSURL URLWithString:urlString]; 
    moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
    moviePlayer.initialPlaybackTime = 0; 
    //Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(endPlay:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:moviePlayer]; 

    moviePlayer.scalingMode = MPMovieScalingModeAspectFit; 
    moviePlayer.movieControlMode = MPMovieControlModeDefault; 
    moviePlayer.backgroundColor = [UIColor blackColor]; 

    [moviePlayer play]; 

} 

-(void)endPlay: (NSNotification*)notification{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 
    moviePlayer.initialPlaybackTime = -1; 
    [moviePlayer stop]; 
    [moviePlayer release]; 
} 
1

Kann Ihr Code Nir nicht sehen, und ich bearbeiten Privilegien nicht so hier haben, ist es wieder soweit:

Das Geheimnis in der Axialspielstruktur legt mit der Einstellung der: moviePlayer.initialPlaybackTime = -1; bevor es freigegeben wird. Probieren Sie es aus: :)

-(void)playMovie:(NSString *)urlString{ movieURL = [NSURL URLWithString:urlString];   
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];  
moviePlayer.initialPlaybackTime = 0; 
//Register to receive a notification when the movie has finished playing. 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endPlay:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 

moviePlayer.scalingMode = MPMovieScalingModeAspectFit; 
moviePlayer.movieControlMode = MPMovieControlModeDefault; 
moviePlayer.backgroundColor = [UIColor blackColor]; 

[moviePlayer play]; 

} 

-(void)endPlay: (NSNotification*)notification{ 
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 
moviePlayer.initialPlaybackTime = -1; 
[moviePlayer stop]; 
[moviePlayer release]; 
}