iOS 6 より前は、
- (void)viewDidUnload {
self.someDelegate = nil;
[super viewDidUnload];
}
viewDidUnload が非推奨になったので、どこでデリゲートを nil に設定すればよいでしょうか? ありがとう!
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 はもう存在しません (したがって、ダングリング ポインターを回避します)。weak
nil
[編集] コメントで @Martin R が説明したように、iOS6 でメモリ警告を受け取ったときにビューがアンロードされなくなったため、メモリ警告を受け取ったこのケースを管理し、そこでデリゲートを解放することを考える必要はありません。この使用例は、iOS6 ではもう発生しません。
まあ、私はこれを自分で思いついたわけではありませんが、あなたを助ける必要がある場合:ビュー コントローラのビューが使用されていない場合は、このメソッドを使用してそのビューへの参照を解放することもできます。これを行う前に、ビューがウィンドウ内にないことをテストする必要があります。」
http://www.bgr.com/2012/06/11/ios-6-beta-download-link-iphone-ipad-ipod-touch-release/
iOS 6 より前は、
- (void)viewDidUnload { self.someDelegate = nil; [super viewDidUnload]; }
これどこで聞いた?
viewDidUnload
iOS 6 より前のバージョンが何であるかさえ知っていますか?
viewDidUnload
ビューがアンロードされるメモリ不足の状況でのみ呼び出されます。通常の運用では使用しません。他のことをするために呼び出されることに依存していた場合、それは間違っています。
self
さらに、とにかくのデリゲートを nilに設定する必要があるのはなぜですか? 「デリゲートをナイルする」とは、他のオブジェクトのデリゲート ( を指すself
) をnil
いつself
解放するかを設定することを指します。のデリゲートの設定は意味がありません ( が使用されなくなった場合、self
なぜ on の設定を気にするのでしょうか?)。self
self