__NSCFString playbackFinalizado selector no reconocido de MPMoviePlayerController

Estoy usando MPMoviePlayerController dentro de una class que he creado llamado MYVideo . Aquí está el código:

 #import <MediaPlayer/MediaPlayer.h> #import "MYVideo.h" @interface MYVideo() @property (strong, nonatomic) UIView * viewRef; @property (strong, nonatomic) NSDictionary * contentData; @property (strong, nonatomic) MPMoviePlayerController * videoController; @end @implementation MYVideo @synthesize contentData,videoController,viewRef; - (MYVideo*) initIntoView: (UIView*) view withContent:(NSDictionary*)contentDict{ self=[super init]; viewRef=view; contentData = contentDict; NSString *rawUrl = [[NSString alloc] initWithFormat:@"http://....com/app/%@.mp4", [contentDict objectForKey:@"cnid"]]; NSURL *videoUrl = [[NSURL alloc]initWithString:rawUrl]; videoController = [[MPMoviePlayerController alloc] initWithContentURL:videoUrl]; videoController.movieSourceType=MPMovieSourceTypeFile; videoController.view.frame = viewRef.bounds; [videoController.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; videoController.controlStyle=MPMovieControlStyleNone; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:videoController]; [viewRef addSubview:videoController.view]; return self; } - (void) playbackFinished: (NSNotification*) notification { NSLog(@"playback finished"); if(videoController){ [videoController play]; } } - (void) play: (int) offset { videoController.initialPlaybackTime=offset; [videoController play]; } - (void) stop { [[NSNotificationCenter defaultCenter] removeObserver:self name:@"playbackFinished" object:nil]; if(videoController){ [videoController stop]; } } - (void) destroy { if(videoController){ [videoController stop]; [videoController.view removeFromSuperview]; } } @end 

Mi problema es que de vez en cuando aparece el siguiente error:

 playback finished -[__NSCFString playbackFinished:]: unrecognized selector sent to instance 0x1664e6a0 

Lo que supongo es que el MPMoviePlayerController dispara la notificación de "reproducción MPMoviePlayerController " cuando ya se ha liberado esta class de video. ¿Tengo razón al pensar esto?

La cosa es que esta class MYVideo debería estar allí mientras se reproduce el video, este error solo ocurre cuando se reproduce el video y en el logging de la console, mi NSLogging de "reproducción finalizada" precede inmediatamente a la falla. Además, nunca cerré la class sin primero eliminar el observador "playbackFinished".

¿Alguien me puede sugerir por qué iba a tener este crash?

Muchas gracias.

Sí, parece que no estás eliminando al observador, ya que este código:

 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"playbackFinished" object:nil]; 

debiera ser:

 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"playbackFinished:" object:nil]; // ^ 

o mejor aún (ya que realmente no le importa lo que se llama):

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

Además, dado que usa testings como if (videoController) { ... } en tantos lugares, debe asegurarse de que no sea lo más pronto posible:

 - (void)destroy { if(videoController){ [videoController stop]; [videoController.view removeFromSuperview]; videoController = nil; // Add } }