3

2 つの UIViewControllers を持つ単純なストーリーボード アプリケーションを作成しており、モーダル セグエを使用してそれらを切り替えています。各 UIViewController には、別の UIViewController へのセグエを実行するために使用される 1 つの UIButton があります。viewDidLoad メソッドでは、各 UIViewController でその UIButton の外観をアニメーション化します。Cross Dissolve Modal セグエを使用しています。

最初の UIViewController で UIButton を押すと、2 番目の UIViewController に移動し、アニメーションが実行され、2 番目の UIViewController が表示されます。2番目のUIView ControllerでUIButtonを押すと、最初のUIViewControllerが表示され、アニメーションが実行されます。すべてがうまく見え、UIViewController に移動するたびに、viewDidLoad メソッドが各 UIViewController に対して呼び出されます。そして、それは素晴らしいです。

XCode Interface Builder でデフォルトで提供されている Modal セグエ タイプを Cross Dissolve から他の 2 つに変更しようとしました。私は Cover Vertical に変更しましたが、何も変更せずにすべてが正常に機能しました。しかし、 Flip Horizo​​ntal Modal segueを試したところ、問題が発生しました。

Flip Horizo​​ntal Modal セグエを実行すると、両方の UIViewControllers に私の UIButton が表示されますが、アニメーションは実行されません。デバッグを試みましたが、アニメーション コマンドが実行されていることは確かですが、アニメーションが表示されません。

それが私の最初の質問です:これらのタイプのモーダルセグエの間にアニメーションが表示されない原因となる違いがあることを誰か知っていますか?

その他の質問は、セグエとメモリ管理の基本理論に関連しています。セグエを実行して UIViewController に移動すると、毎回 viewDidLoad メソッドが呼び出されます。では、viewDidLoad メソッドが実行されるたびに新しいオブジェクト インスタンスを作成したということでしょうか。

また、 viewDidUnload メソッドが呼び出されないことにも気付きました。前の質問への回答が肯定的である場合 (viewDidLoad の実行ごとに新しいオブジェクト インスタンスが作成される)、それは私の UIViewController オブジェクト インスタンスがアンロードおよび削除されないことを意味しますか? それとも、ARC が舞台裏でガベージ コレクションを行っているのでしょうか。

ストーリーボードのセグエとメモリ管理/オブジェクトのライフサイクルで物事がどのように機能するか、およびviewDidUnloadメソッドが呼び出されない理由を誰かが説明できれば、とても感謝しています.


[編集 #1: モーダル セグエの実行後に UIViewController をアンロードしようとする]

[更新 #1: これは行うべきではありません。viewDidUnload が自動的に呼び出されます]

UIButtonクリックに付属するIBActionでセグエを作っています。モーダルセグエを実行するために、この平和なコードを書きました。

@try
{
    [self performSegueWithIdentifier:segueToPerform sender:self];
}
@catch (NSException *exception) 
{
    NSLog(@"Exception: %@", exception);
}
@finally
{
    [self viewDidUnload];
}

@finally ブロックで手動で viewDidUnload を呼び出しました。天気予報を確認しました viewDidUnload が実行時に呼び出され、はい、呼び出されます。

これは、別の UIViewController からモーダル セグエを使用して移動したときに作成した UIViewController オブジェクトをアンロードし、メモリから削除できたということですか?

このメソッドは次の代わりとして定期的ですか:

[self dismissViewControllerAnimated:YES completion:nil];

この上記の行は、現在の UIViewController に移動した元の UIViewController に戻りますが、現在の UIViewController から他の UIViewControllers への新しいセグエを実行する必要があるため (現在の UIViewController に移動した元の UIViewController に戻る以外に)、それは私のニーズに合わないためです。 1)?


[編集 #2: 終了]

最後に、実装モデルを変更し、これらの UIView 用に個別の XIB ファイルを作成した後、単一の UIViewController の下に新しい UIView をロードしました。@dasblinkenlight からの回答には多くの有用な情報が含まれており、その回答に関する議論はモーダル セグエの使用に関するいくつかの疑問に対する適切な回答を提供するため、正しい回答としてマークしました。

4

2 に答える 2

4

あなたの質問の最初の部分への答えはわかりませんが、2 番目の部分への答えがわかれば、いずれにせよ別の解決策を選択することになるでしょう。

viewDidLoadメソッドは毎回呼び出されます。viewDidLoadでは、メソッドが実行されるたびに新しいオブジェクト インスタンスを作成したということでしょうか。

絶対。「モーダル」セグエにより、新しいビューが閉じられるまで、新しいビューが古いビューを完全に覆い隠します。何度も行き来すると、コードは現在のビューの下にビューの「スタック」全体を蓄積します。

viewDidUnloadまた、メソッドが呼び出されないことにも気付きました。前の質問への回答が肯定的である場合 (viewDidLoad実行ごとに新しいオブジェクト インスタンスが作成される)、それは私のUIViewControllerオブジェクト インスタンスがアンロードおよび削除されないことを意味しますか?

これは正しいです。作成したすべてのビュー コントローラーはまだそこにあり、その上にあるビューを閉じる準備ができています。

それとも、ARC が舞台裏でガベージ コレクションを行っているのでしょうか。

ARC はガベージ コレクターではなく、コンパイラからの自動化を少し備えた参照カウント メカニズムです。オブジェクトはまだそこにあります。

コードを変更して呼び出す必要があります

[self dismissModalViewControllerAnimated:YES];

最初のコントローラに戻るモーダル セグエを使用するのではなく、2 番目のコントローラで。

于 2012-09-03T16:11:05.340 に答える
0

複雑な VC ナビゲーション Web があり、結果としてセグエ (UINavigationController なし) を使用すると、メモリを大量に消費するという同様の問題が発生しました。この質問/回答を見て、私の最終的な解決策を確認してください。ここでの uerceg と dasblinkenlight の会話は、この解決策を見つけるのに役立ちました。

メモリからの履歴 ViewController のセグエとクリア

于 2013-01-02T01:57:21.970 に答える