2

私は iPhone アプリの 2 番目のバージョンを書き始めており、以前の間違いを正そうとしています (Objective-C での最初の試みであるため)。私の質問は「UIViewController が破棄されたときに私がしなければならないこと」に関するものですが、矛盾する答えがいくつかあるようで、正しく理解していることを確認したいと思います。

いくつかの制約:

  1. このコードは、iOS 5 および iOS 6 デバイスで使用するためのものです
  2. UIViewControllers はユーザーに表示されなくても通知を受け取る必要があるため、viewWillAppear および viewWillDisappear で NSNotifications を登録および登録解除したくありません。
  3. 個別の nib ファイルではなく、StoryBoard を使用しています。

上記の制約を考慮すると、次のステートメントは正しいでしょうか?

  1. ストーリーボードを UIViewControllers に接続する IBOutlets は弱い必要があり、強力な参照がバックグラウンドで作成されます。
  2. IBOutlets は弱いため、メモリ不足の状況で IBOutlets を nil アウトする必要はありません。
  3. viewDidUnload は非推奨なので使用しないでください。代わりに didReceiveMemoryWarning を使用する必要があります。この状況では、強力なプロパティ (再計算できる) を無効にするだけで済みます。
  4. viewDidLoad で NSNotifications に登録することは許容されます。
  5. ビューが非表示になっても通知を受け取り続けたいので、登録解除するのに最適な場所は dealloc です。didReceiveMemoryWarning で登録解除してもメリットはありません。

ご協力いただきありがとうございます、

ダン

4

2 に答える 2

4

ストーリーボードをUIViewControllersに接続するIBOutletsは弱くする必要があり、強力な参照が舞台裏で作成されます。

いいえ。NSKeyedUnarchiver(NSCoder)は、ユーザーが作成したアウトレットに関連付けられているストレージ修飾子を変更しません。IBOutletsを明示的に割り当てて初期化することはないため、それらを弱く保ちます。したがって、ココアという言葉の意味でそれらを「所有」することはありません。

IBOutletsは弱いので、メモリが少ない状況でそれらをゼロにする必要はありません。

まったく真実ではありません。弱参照をゼロにすることは、メモリ不足の状況ではなく、deallocでゼロになります。Appleは、メモリ警告を処理するための強力なアウトレットを明示的にリリースすることによって、それを行うことを期待しています。

viewDidUnloadは非推奨になっているため、使用しないでください。代わりに、didReceiveMemoryWarningを使用する必要があります。この状況では、(再計算できる)強力なプロパティを削除するだけで済みます。

はい。ただし、-viewDidUnloadの代わりに、deallocがその目的を果たします。

viewDidLoadでNSNotificationsに登録することは許容されます。ビューが非表示になっているときに通知を引き続き受信したいので、通知を登録解除するのに最適な場所はdeallocです。また、didReceiveMemoryWarningで通知を登録解除してもメリットはありません。

絶対。

于 2013-03-01T14:26:46.973 に答える
1

あなたの言うことは正しいと思います。IBOutletsおよび強/弱参照については、このスレッドを参照してください。

通知について:didReceiveMemoryWarningで登録を解除すると、登録解除時にメモリが解放されないため、意味がないように見えます。したがって、割り当て解除時にそれらの登録を解除するのは正しいことです。

于 2013-03-01T14:35:41.763 に答える