1

iOS 6 より前は、

- (void)viewDidUnload {
   self.someDelegate = nil;
   [super viewDidUnload];
}

viewDidUnload が非推奨になったので、どこでデリゲートを nil に設定すればよいでしょうか? ありがとう!

4

3 に答える 3

4

iOS6 でメモリ警告を受け取ったときに、ビューがアンロードされなくなりました。そのため、そのような場合にビューがアンロードされるviewDidUnloadことはなく、iOS6 で呼び出されることもありません。

古い動作 (メモリ警告を受け取ったときにビューをアンロードする) を本当に模倣したい場合はdidReceiveMemoryWarning、プロパティが nil であることをテストした後self.view.window(ビューが画面上にないことを意味します) 、View Controller のメソッドにこの動作を実装する必要があります。 、したがって「アンロード」されます。これは、古いviewDidUnloadケースと同じ状況にあることを意味します)。

-(void)didReceiveMemoryWarning
{
    if (self.isViewLoaded && !self.view.window)
    {
        // If view already loaded but not displayed on screen at this time (not attached to any window) then unload it
        self.view = nil;

        // Then do here what you used to do in viewDidUnload
        self.someDelegate = nil;
        ...
    }
    [super didReceiveMemoryWarning];
}

ただし、ARC と iOS5+ を使用している場合は、プロパティ属性と、弱い変数とプロパティが指しているオブジェクトの場合に自動的にリセットする Zeroing-Weak-References メカニズムnilのおかげで、通常、デリゲートを設定する必要はもうありません。to はもう存在しません (したがって、ダングリング ポインターを回避します)。weaknil

[編集] コメントで @Martin R が説明したように、iOS6 でメモリ警告を受け取ったときにビューがアンロードされなくなったため、メモリ警告を受け取ったこのケースを管理し、そこでデリゲートを解放することを考える必要はありません。この使用例は、iOS6 ではもう発生しません。

于 2012-09-23T23:25:28.620 に答える
3

まあ、私はこれを自分で思いついたわけではありませんが、あなたを助ける必要がある場合:ビュー コントローラのビューが使用されていない場合は、このメソッドを使用してそのビューへの参照を解放することもできます。これを行う前に、ビューがウィンドウ内にないことをテストする必要があります。」

http://www.bgr.com/2012/06/11/ios-6-beta-download-link-iphone-ipad-ipod-touch-release/

于 2012-09-23T23:16:10.177 に答える
1

iOS 6 より前は、

  • (void)viewDidUnload { self.someDelegate = nil; [super viewDidUnload]; }

これどこで聞いた?

viewDidUnloadiOS 6 より前のバージョンが何であるかさえ知っていますか?

viewDidUnloadビューがアンロードされるメモリ不足の状況でのみ呼び出されます。通常の運用では使用しません。他のことをするために呼び出されることに依存していた場合、それは間違っています。

selfさらに、とにかくのデリゲートを nilに設定する必要があるのはなぜですか? 「デリゲートをナイルする」とは、他のオブジェクトのデリゲート ( を指すself) をnilいつself解放するかを設定することを指します。のデリゲートの設定は意味がありません ( が使用されなくなった場合、selfなぜ on の設定を気にするのでしょうか?)。selfself

于 2012-10-31T00:26:13.567 に答える