当视图扩展为FullScreen时,MPMoviePlayerController被释放

时间:2012-10-02 02:39:16

标签: ios xcode mpmovieplayercontroller xcode-instruments

如何检查MPMoviePlayerController的实例何时被解除分配?注意我已经将NSZombieEnabled设置为YES并进行了检查。

有问题的代码在我的应用中的某些情况下效果很好。另一方面,当展开带有moviePlayer控件的视图时,会执行MPMoviePlayerDidEnterFullscreenNotification回调方法,并且在屏幕变黑并且用户视点中的应用程序冻结后不久。 (不同之处在于这个在导航堆栈上有一个额外的viewController)。它不会使应用程序崩溃。它仍在运行,但无法返回到可用的UI。

在调试器中,我检查实例“活着”的最后已知时间以获取其地址,检查并发现它已解除分配:

2012-10-01 18:35:46.032 MyApp[930:907] -[MyMoviePlayerViewController moviePlayerDidEnterFullscreenNotification:](203): : moviePlayer = <MPMoviePlayerController: 0x1dba9420> loadState = 3
2012-10-01 18:36:05.280 MyApp[930:907] [MPAVController] Autoplay: Enabling autoplay

此处出现黑屏,因此我检查调试器:

(lldb) po 0x1dba9420
2012-10-01 18:37:38.656 MyApp[930:907] *** -[MPMoviePlayerController respondsToSelector:]: message sent to deallocated instance 0x1dba9420
(int) $0 = 498766880 [no Objective-C description available]

如果我检查其他类的其他已知实例,它们仍然存活并且符合预期:

(lldb) po 0x1da12110
(int) $1 = 497099024 <MyDetailViewControllerWithTableView: 0x1da12110>
(lldb) po 0x1da1af70
(int) $2 = 497135472 <MyMasterTableViewController: 0x1da1af70>
(lldb) po 0x1da19be0
(int) $3 = 497130464 <NSFetchedResultsController: 0x1da19be0>

因此,重申一下,如何检查何时以及实例被解除分配或销毁?是否有可以使用的仪器类型。 分配表明实例已经分配,​​现在还没有存在......

我想我可以一步步追踪,但这很乏味...... 能够在事件发生和触发时设置条件会很棒 要停止的仪器(或调试器)。

1 个答案:

答案 0 :(得分:1)

我修好了。看起来当用户展开moviePlayer时,事件生命周期会导致视图(MyAddDetailViewController)(包含子视图(MyMoviePlayerController))执行viewWillDisappear&amp; viewDidDisappear。

我提到代码路径在导航堆栈上创建了一个额外的viewController,并且VC正在进行简短的外观(由viewWillAppear消息证明),然后使用viewWillDisappear返回到后台。目前还不清楚为什么会导致autoreleasePool释放MyAddDetailViewController从而解除分配MyMoviePlayerController,但现在很清楚,没有对MyAddDetailViewController的强引用。

为了解决这个问题,我在VC中创建了一个属性,它将MyAddDetailViewController推送到导航堆栈以保存对它的强引用。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// ... snip ...
    self.myAddDetailViewControllerReference = [segue destinationViewController];

}

//

- (void)viewDidUnload {
    [self setMediaAddDetailViewControllerReference:nil];

}

负责黑屏/冻结。