如何检查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>
因此,重申一下,如何检查何时以及实例被解除分配或销毁?是否有可以使用的仪器类型。 分配表明实例已经分配,现在还没有存在......
我想我可以一步步追踪,但这很乏味...... 能够在事件发生和触发时设置条件会很棒 要停止的仪器(或调试器)。
答案 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];
}
负责黑屏/冻结。