0

私の iOS アプリは、次の構造のナビゲーション ベースです。

@interface ViewControllerA : UIViewController
@property (strong,nonatomic) ViewControllerB *viewControllerB;
@property (strong,nonatomic) ViewControllerC *viewControllerC;
...

viewControllerBがそれらをプッシュする前にviewControllerCインスタンス化されます。ViewControllerAnavigationController

私の理解では、保持されているものはすべてViewControllerAnil in に設定する必要がありViewControllerAますviewDidUnload。子View Controllerにも同じことをする必要がありますか? このような:

-(void)viewDidUnload
{
    self.viewControllerB=nil;
    self.viewControllerC=nil;
}

から開始された「受信メモリ警告」があったときに問題を発見しましたviewControllerC。その後、viewDidUnload親ビュー コントローラ (つまりviewControllerA) が呼び出され、nil が「viewControllerB」に設定されました。意外にも、viewControllerB の viewDidUnload も呼び出されます。そのため、 nil を のサブビュー ( 内) に設定すると、「割り当て解除されたオブジェクトにメッセージが送信されました」というメッセージが表示されましviewControllerBた。viewControllerBviewDidUnload

nil を子ビュー コントローラーに設定してはならないということですか? この状況でのメモリ管理のベスト プラクティスは何ですか?

PS私はARCを使用しています。

4

1 に答える 1

1

を呼び出した後、はその状態を維持viewDidUnloadするUIViewController必要があります。つまり、簡単に再作成できないものは解放しないでください。通常、ビュー階層に関連するすべてのデータを nil に設定します。たとえば、一部のサブビューへの強い参照や、.xml で作成されたカスタム データなどですviewDidLoad。あなたの例では、親コントローラー A はviewDidUnload呼び出された後に回復できると予想されます。つまり、将来、呼び出しviewDidLoadによってコントローラーが復元され、クラッシュすることはありません。

さらに、すべてのビュー コントローラーはメモリ警告通知用に登録されているため、メモリ警告が発生すると、現在表示されていないビューをアンロードできます。ビュー コントローラーが呼び出される順序が決定論的であるかどうかはわかりません。たとえば、最上位のビュー コントローラーから呼び出されるなどUIViewControllerですviewDidUnload

ただし、 の後にコントローラーの状態を維持する必要があるため、viewDidUnload子コントローラーを nil に設定してはなりません。あなたがしなければならないことは、コントローラーのサブビューにあるすべての強い参照 (たとえば、UILabel への強い参照など) を放棄することですが、コントローラー自体は放棄しないでください。

于 2012-06-02T18:59:26.707 に答える