2

のインスタンスの割り当てが解除されたことを確認するにはどうすればよいMPMoviePlayerControllerですか?すでにNSZombieEnabledをYESに設定してチェックしていることに注意してください。

問題のコードは、私のアプリの特定の状況下でうまく機能します。もう1つは、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>

繰り返しになりますが、インスタンスがいつ、どのように割り当て解除または破棄されるかをどのように確認しますか?使用できる楽器タイプはありますか?割り当ては、インスタンスが割り当てられ、現在は生きていないことを示しています。

ステップバイステップのトレースを実行できると思いますが、それは面倒です...イベントが発生したときに条件を設定し、Instruments(またはデバッガー)を停止させることができれば素晴らしいと思います。

4

1 に答える 1

1

これを修正しました。ユーザーが moviePlayer を展開すると、イベント ライフサイクルによってビュー (MyAddDetailViewController) (サブビュー (MyMoviePlayerController) を保持する) が viewWillDisappear と 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];

}

これにより、黒い画面/フリーズが処理されます。

于 2012-10-02T04:06:28.667 に答える