1

4 つの VC がプッシュされたナビゲーション コントローラーがあります。スタックの一番上にある VC に設定されたデリゲート プロパティを持つシングルトン クラスがあります。各 VC の dealloc メソッドで、このデリゲートを nil に設定しています。rootVC の viewdidappear メソッドでデリゲートを設定しています。

4 番目の VC からルート VC に戻ると、(スタック内のすべての VC の) dealloc メソッドと viewdidappear メソッドを呼び出すシーケンスは次のようになります。

"FirstVC dealloc called"
"SecondVC dealloc called"
"viewdidappear of root VC is called"
"ThirdVC dealloc called"

現在、私が直面している問題は、ルート VC の viewdidappear メソッド (制御フローからも見える) でデリゲートを自己に設定しているにもかかわらず、デリゲートが nil に設定されることです。どうすればこの状況を防ぐことができますか? すべての VC の割り当てが実際に解除されたら、viewdidappear メソッドが呼び出されるようにします。

ありがとう、オベイド

4

2 に答える 2

1

deallocオブジェクトが不要になると、自動的に呼び出されます。をポップするThirdVCと、デリゲートプロパティはまだそれを保持しているため、dealloc呼び出されません。次に、rootVCviewDidAppearが呼び出されると、rootVCがデリゲートとして設定されます。この時点で、thirdVCは不要になり、がトリガーされますdealloc

できることの1つは、deallocではなくviewWillDisappear各メソッドでdelegateプロパティをnilに設定することです。ViewControllerこれは、このメソッドが次のメソッドが表示される前に必ず呼び出されるためViewControllerです。

于 2012-08-07T13:47:35.607 に答える
1

Apple が何らかの保証を公開しない限り、メソッド呼び出しの順序を予測できないため、次のようなメソッドを作成して、シングルトンを防御的にプログラムすることができます。

- (void)removeDelegate:(UIViewController *)oldDelegate;

デリゲートが指定された古いデリゲートと一致する場合は、nil に設定します。

于 2012-08-07T13:39:00.843 に答える