Objective c 将对象设置为nil iOS7 vs iOS8

Objective c 将对象设置为nil iOS7 vs iOS8,objective-c,xcode,ios8,Objective C,Xcode,Ios8,WI-Fi有一个iPad kiosk应用程序,可以在通过HDMI连接到iPad的外部显示器上显示视频。我有一个viewController,用于管理外部监视器上的视图。当我播放完一段视频后,我就关闭了MPMoviePlayerController实例。在iOS7中,这很好,但在iOS8中,我在将电影播放器设置为零后遇到了严重崩溃 - (void)removeMoviePlayer { [self.moviePlayerController.view removeFromSuperview]; [

WI-Fi有一个iPad kiosk应用程序,可以在通过HDMI连接到iPad的外部显示器上显示视频。我有一个viewController,用于管理外部监视器上的视图。当我播放完一段视频后,我就关闭了MPMoviePlayerController实例。在iOS7中,这很好,但在iOS8中,我在将电影播放器设置为零后遇到了严重崩溃

- (void)removeMoviePlayer {
[self.moviePlayerController.view removeFromSuperview];
[self removeMovieNotificationHandlers];
self.moviePlayerController = nil;}
启用僵尸后,我在调试器中收到一条消息:

[MPAVController release]: message sent to deallocated instance

同样,当应用程序在iOS7下运行时,不会发生此崩溃。是什么改变导致了这次崩溃?

经过几天的反复尝试,我发现当尝试关闭MPMoviePlayerController实例时,当mpmovieplayerblaybackstate被mpmovieplaybackstate暂停时,应用程序会崩溃。当视频结束时,MPMoviePlayerController发送MPMoviePlaybackDidFinish通知,将播放状态报告为MPMoviePlaybackStatePaused。修复方法是测试播放状态,如果暂停调用[MPMoviePlayerController stop]。这会将MPMoviePlaybackState更改为MPMoviePlaybackState stopped,然后可以在不发生崩溃的情况下关闭实例

此崩溃在iOS 8之前没有发生。代码如下:

-(void)moviePlayBackDidFinish:(NSNotification *)notification { [self stopVideo:notification]; } - (void)stopVideo:(NSNotification *)notification { if (self.moviePlayerController) { if (self.moviePlayerController.playbackState == MPMoviePlaybackStatePlaying || self.moviePlayerController.playbackState == MPMoviePlaybackStatePaused) { [self.moviePlayerController stop]; } [self cleanUpVideo]; } } - (void)cleanUpVideo { [self killProgressTimer]; [UIView animateWithDuration:1.0f animations:^{ self.closedCaptionLabel.alpha = 0.0f; self.moviePlayerController.view.alpha = 0.0f; self.backgroundImageView.alpha = 1.0f; } completion:^(BOOL finished) { [self removeMoviePlayer]; [self resetClosedCaptions]; [self.delegate videoDidStop]; }]; } - (void)removeMoviePlayer { [self.moviePlayerController.view removeFromSuperview]; [self removeMovieNotificationHandlers]; self.moviePlayerController = nil; }
self-removeMovieNotificationHandlers是做什么的?如果你添加了崩溃发生的那一行就好了。例外情况是,不一定有人能指出什么变化——更可能的是,你在某个地方有一些细微的、模糊的误用,从技术上来说,这意味着你的应用程序有未定义的行为。7岁以下的未定义行为不必与8岁以下的未定义行为相关。问题一:你在使用ARC吗?