为什么不能多次使用MPMoviePlayerController?

mig*_*aza 12 mono mpmovieplayercontroller xamarin.ios ios

在MonoTouch中,我们遇到了电影播放器​​样本的问题,因为它只会播放一次视频,但不会再播放一次.

我问这个问题是要发一个答案,因为它一直在打击各种各样的人.

Geo*_*ton 17

MPMoviePlayerController是引擎盖下的单身人士.如果您没有正确释放(ObjC)或Dispose()'d(MonoTouch)并且您创建了第二个实例,它将无法播放或仅播放音频.

此外,如果您订阅MPMoviePlayerScalingModeDidChangeNotification或MPMoviePlayerPlaybackDidFinishNotification或MPMoviePlayerContentPreloadDidFinishNotification,请注意发布的NSNotification也会引用MPMoviePlayerController,因此如果您保留它,您将有一个引用播放器.

尽管Mono的垃圾收集器最终会启动,但这是一种需要确定性终止的情况(您希望引用现在消失,当GC决定执行收集时不会消失).

这就是您希望在控制器上调用Dispose()方法以及在通知上调用Dispose()方法的原因.

例如:

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

如果您正在收听通知,请在最后通知处理程序中调用Dispose,以释放它保存到MPMoviePlayerController的引用,例如:

var center = NSNotificationCenter.DefaultCenter;
center.AddObserver (
    "MPMoviePlayerPlaybackDidFinishNotification"),
    (notify) => { Console.WriteLine ("Done!"); notify.Dispose (); });
Run Code Online (Sandbox Code Playgroud)