1

私は本を​​読んでいましたが、アプリがメモリ不足の警告を受け取ったときにIBOutletsasを宣言することで問題を解決する必要があることを示唆していました。weakたとえば、メソッドでこれらのアウトレットを nil に設定する必要はもうありませviewDidUnload

viewDidUnloadまた、iOS6では廃止され、代わりに呼び出されると聞きましたdidReceiveMemoryWarning

とにかく、どうすればいいですか、自分IBOutletの s を として宣言しweak、 and の実装didReceiveMemoryWarningsを「忘れる」べきviewDidUnloadsですか?

4

4 に答える 4

2

すべてIBOutletsを作る必要はありませんweak。Apple ドキュメントからの推奨事項(リソース プログラミング ガイド)

ファイルの所有者から nib ファイル (または、iOS ではストーリーボード シーン) 内の最上位オブジェクトへのアウトレットを除いて、アウトレットは一般的に弱くする必要があります。したがって、作成するアウトレットは通常、弱いものにする必要があります。理由は次のとおりです。

  • ビュー コントローラのビューまたはウィンドウ コントローラのウィンドウのサブビューなどに作成するアウトレットは、所有権を意味しないオブジェクト間の任意の参照です。

  • 強力なアウトレットは、フレームワーク クラスによって頻繁に指定されます (たとえば、UIViewController のビュー アウトレット、または NSWindowController のウィンドウ アウトレット)。

例:

XIB の最上位オブジェクトを宣言する必要がありstrong、その他のサブビュー/コントロールはすべてweakプロパティにする必要があります。

    @property (nonatomic, weak)   IBOutlet MyView *viewContainerSubview;
    @property (nonatomic, strong) IBOutlet MyOtherClass *topLevelObj;

ARCweakライフタイム修飾子を使用すると、独自の利点があります(Appleドキュメントを参照)。

__weak は、参照先のオブジェクトを存続させない参照を指定します。オブジェクトへの強い参照がない場合、弱い参照は nil に設定されます。

そのため、の設定について心配する必要はありませんIBOutlets nil。その有効期間は、最上位のインスタンスによって自動的にバインドされます。

didReceiveMemoryWarningメモリを占有している再作成可能なリソースをクリアするために実装する必要があります。呼び出しを受け取ったらdidReceiveMemoryWarning、それを使用して、使用されている重要でないリソースを解放する必要があります。たとえば、カスタム データ構造、UI の入力に使用される Web サービス レスポンスなどです。重要でないリソースは、開発者が決定する必要があります。

于 2013-08-22T11:57:27.853 に答える
0

IBOutlet を弱いものとして使用することをお勧めします。それらを強力として宣言すると、メモリ不足の状態の場合に、viewDidUnload メソッドでそれらをクリアするために処理する必要がある場合があります。

ただし、メモリの問題が発生した場合にメモリから削除できるアウトレット以外にも、さらに多くのオブジェクトがあります。したがって、プログラムのアウトレットが弱い場合は、キャッシュされたデータ オブジェクトを考慮し、他に注意する必要があります。

于 2013-08-22T11:23:40.070 に答える
0

Appleのドキュメントによると:

メモリは iOS の重要なリソースであり、View Controller は重要なときにメモリ フットプリントを削減するための組み込みサポートを提供します。UIViewController クラスは、不要なメモリを解放するdidReceiveMemoryWarningメソッドを通じて、メモリ不足状態の自動処理を提供します。

iOS 6 より前では、メモリ不足の警告が発生したときに、後で再読み込みまたは再作成できることがわかっている場合、UIViewController クラスはそのビューを消去していました。これが発生した場合は、viewWillUnload メソッドと viewDidUnload メソッドも呼び出してビュー階層に関連付けられているすべてのオブジェクトの所有権を放棄する機会をコードに与えます。これには、nib ファイルからロードされたオブジェクト、viewDidLoad メソッドで作成されたオブジェクト、および作成されたオブジェクトが含まれます。実行時に遅延してビュー階層に追加されます。iOS 6 では、ビューがパージされることはなく、これらのメソッドが呼び出されることもありません。メモリが少ないときにView Controllerが特定のタスクを実行する必要がある場合は、didReceiveMemoryWarningメソッドをオーバーライドする必要があります。

したがって、ビューが削除されなくなったため、IBOutlet 参照をどこでも nil に設定する必要はありません。didReceiveMemoryWarning などでそれらを nil に設定しても意味がありません。しかし、viewDidUnload で、簡単に再作成されたモデル オブジェクトを解放したり、キャッシュを空にしたりしてメモリ不足のイベントに対応していた場合、そのようなことは確実に行う必要があります。 didReceiveMemoryWarning に移動します。

于 2013-08-22T11:27:53.153 に答える
0

iOS6 以降、ビューはメモリ警告で自動的にアンロードされなくなりました。もちろん、これはメモリの使用がもはや問題ではないという意味ではありません。単に「忘れる」ことはできません。

IBOutlets はweak、viewcontroller のビューによって (直接的または間接的に) 「所有」されているため、通常は である必要があります。そして通常、それらのライフタイムを親ビューと同じにしたいでしょう。

didReceiveMemoryWarning で可能な限り多くのメモリをクリアするようにしてください。(現在使用されておらず、もちろん再作成できるアセットのメモリ)

于 2013-08-22T11:34:54.127 に答える