UIAlertViewDelegate 的 clickedButtonAtIndex 后崩溃,消息 [MPMoviePlayerViewController isKindOfClass:]: 消息发送

Posted

技术标签:

【中文标题】UIAlertViewDelegate 的 clickedButtonAtIndex 后崩溃,消息 [MPMoviePlayerViewController isKindOfClass:]: 消息发送到已释放实例【英文标题】:crash after UIAlertViewDelegate's clickedButtonAtIndex with message [MPMoviePlayerViewController isKindOfClass:]: message sent to deallocated instance 【发布时间】:2012-06-10 10:21:13 【问题描述】:

我只是想解雇UIAlertView,但我有几天不能处理一个奇怪的错误......

点击UIAlertView 上的取消按钮后,以下代码有效。

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 

    [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES];

但是通过这些行之后,它会崩溃并显示以下消息:

[MPMoviePlayerViewController isKindOfClass:]: message sent to deallocated instance 0x27f590

在同一个视图上,我嵌入了

MPMoviePlayerViewController.moviePlayer.view
[self.view addSubview:vc.moviePlayer.view];

有人知道发生了什么吗? 我使用ARC,ios5.1。如果您需要更多信息,我会添加它们。

提前谢谢你。

更多信息:

我在代码中的所有方法上都设置了断点。 我确保它在clickedButtonAtIndex之后崩溃...

调用 UIAlertView 的代码是

-(void)applicationDidBecomeActive:(NSNotification *)notification

    self.alert = hoge; // set delegate = self
    [self.alert show];

在呼叫他们之后,viewDidAppear 的呼叫。 有嵌入vc.moviePlayer.view之类的代码

MPMoviePlayerViewController *vc;
vc = [[MPMoviePlayerViewController alloc] initWithContentURL:hogeURL];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(finishPreload:)
                                             name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                           object:vc];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(finishPlayback:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:vc];

vc.view.frame = CGRectMake( 0, 0, 320, 440);

vc.moviePlayer.allowsAirPlay = YES;
vc.moviePlayer.shouldAutoplay = NO;
vc.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
vc.moviePlayer.useApplicationAudioSession = NO;

[vc.moviePlayer.view setTag:310];

[self.view addSubview:vc.moviePlayer.view];

我的应用有 3 个标签,其中 2 个是嵌入的 MPMoviePlayerViewController.moviePlayer.view。其他标签的控制器中调用的方法只有viewWillDisappearviewDidDisappear

【问题讨论】:

问题不在于 UIAlertView,而是在按下取消按钮后调用的函数。在您的代码中放置一个断点并检查它到底在哪里崩溃。并向我们​​展示您在哪里启动 MPMoviePlayerViewController,在代码中您是否使用 isKinfOfClass 方法检查任何实例是否为 MPMovieViewController? 感谢您的回复。我在我的问题中添加了更多信息。如果您需要更多信息,请写下来。我真的很感激。 【参考方案1】:

在我看来,您的 MPMoviePlayerController 实例在 viewDidAppear 之后被释放。我认为您应该将 vc 设置为 View Controller 的属性或实例变量,以便它在 View Controller 的整个生命周期中持续存在。

【讨论】:

非常感谢!!我通过将 vc 设置为 @property (strong, nonatomic) MPMoviePlayerViewController *vc 之类的属性来解决它。

以上是关于UIAlertViewDelegate 的 clickedButtonAtIndex 后崩溃,消息 [MPMoviePlayerViewController isKindOfClass:]: 消息发送的主要内容,如果未能解决你的问题,请参考以下文章

通过示例 UIAlertViewDelegate 了解协议实现

我是符合 UIAlertViewDelegate 协议的 NSObject - 释放自己合适吗?

App Delegate 发出警告:“id <UIApplicationDelegate>”不符合“UIAlertViewDelegate”协议

实现我自己的委托时未调用 UIAlertViewDelegate 方法 clickedButtonAtIndex

UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法

UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法