1
-(void)viewDidUnload
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:LASTUPDATEDLOCATION object:nil];
    [self setHeaderViewofWholeTable:nil];
    [self setFooterViewofWholeTable:nil];
    [self setHeaderActivityIndicator:nil];
    [self setFooterActivityIndicator:nil];
    [self setLastUpdated:nil];
    [self setLblPullDowntoRefresh:nil];
    [self setRefreshArrow:nil];
    [self setContainerForFormerHeader:nil];
    [self setFooterContainer:nil];
    [super viewDidUnload];
}

viewDidLoadはビュー自体がnilになると呼ばれていると思いました。ビューをnilに設定すると、それらすべてが自動的にnilになりませんか?

私は何を誤解していますか?

4

4 に答える 4

3

ARCの前は、割り当てたオブジェクトを手動で解放する必要がありました。にマークされているプロパティを設定するとretainnil解放されます。最近のバージョンのXcodeに付属しているコンパイラでデフォルトでオンになっている自動参照カウント(ARC)機能を使用する場合、これは不要になりました。

于 2012-10-25T03:14:04.547 に答える
3

朗報です。iOS 6以降、viewDidUnload非推奨になりました。iOS 5以前では、メモリが不足しているときに、ビューがアンロードされた可能性がありました(メモリリークがないことを確認するために、このメソッドでIBOutletsをリリースしました)。ただし、これはiOS 6では呼び出されなくなったため、要件ではなくなりました。

これで、メモリに問題がある場合、ViewControllerは以下をオーバーライドできます。

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
于 2012-10-25T03:18:16.243 に答える
2

他の答えのいくつかはこれのいくつかをカバーしていますが、これにはもっとあります。ビューコントローラには、そのviewDidLoadメソッドが呼び出されます。通常、これによりIBOutletsが保持され、場合によっては他の多くのビューやオブジェクトが割り当てられて保持されます。すべてがうまくいけば、最終的にView Controllerの割り当てが解除され、保持されているすべてのオブジェクトを解放する必要があります。

それがシンプルで幸せな道です。低メモリ状態では、iOS 5以前では、ViewControllerのビューがアンロードされる可能性があります。このviewDidUnload方法は、プロセスの一部として保持されていた他のすべてのオブジェクトをクリーンアップするチャンスでしたviewDidLoad。そして、これが主な理由です-ある時点で、viewDidLoadViewControllerのビューを再表示するために再度呼び出される可能性があります。

ほとんどの人は、viewDidLoad一度だけ呼び出されるようにメソッドを記述します。そして、viewDidUnloadメソッドがオブジェクトを適切にクリアする場合、これはOKです。そうでない場合は、次の呼び出しviewDidLoadで大量のメモリリークが発生します。

で適切にクリーンアップしなかった場合、ARCはメモリリークの問題をほぼ解消しましたviewDidUnload。しかし、viewDidUnloadそれでも必要なときにメモリをクリーンアップするのに役立ちました。

前述のように、iOS 6の時点で、ビューコントローラのビューはメモリ不足の状態でアンロードされることはなく、viewDidUnload(およびviewWillUnload)メソッドは非推奨になりました。

アプリがiOS6とともにiOS5を引き続きサポートしている場合でも、を適切に使用する必要がありますviewDidUnload。ただし、必要に応じてメモリを解放する場合は、を使用してdidReceiveMemoryWarningください。

于 2012-10-25T03:38:27.450 に答える
1

可能な限り多くのメモリを解放し、プロセッサの負担を軽減し、バッテリ寿命を延ばすために、非常に多くのことをゼロに設定しました。すべてのオブジェクトが自動的にキューから削除されるわけではありません。

于 2012-10-25T03:11:32.637 に答える