4

非メモリリソースに関連する状態を持つオブジェクトは、通常、そのリソースで明示的に「終了」するためのメソッドを提供します。「リソースを使用中」の状態でオブジェクトの割り当て解除が試行された場合に対処するための一般的な方法はありますか?私はいくつかの異なるアプローチを見てきました:

  1. プログラマーが間違いを犯したことをログに記録し、それをデバッグする方法を教えます(それを行いますNSLock
  2. リソースが呼び出し元によって管理されているか、割り当て解除時に放棄されているかを呼び出し元に選択させます(例NSFileHandle
  3. オブジェクトが期待される最終状態にない場合、つまりプログラマーが私のオブジェクトをそのように使用しないことを主張する場合は、例外を発生させます
  4. 帰りはいつも片付けてください。

GCのドキュメントでは、メモリ管理と一緒に他のリソースを管理することは悪い考えであることが確認されており、(まだ)4を実行する例が示されていますが、注意が必要です。それで、誰かが常に従うアプローチを「選んだ」のでしょうか?

4

1 に答える 1

1

ほとんどの Cocoa フレームワーク オブジェクトはガベージ コレクションより前からあるため、たとえば NSFileHandle が最適な方法でそれを行っていると仮定することはできません。この問題は、すべてのシナリオで 1 つのパターンに従うことで、選択の手間を省きたいと考える多くの問題の 1 つだと思います。残念ながら、それは不可能だと思います。ケースバイケースで何が最善かを判断する必要があります。

オプションを選択する理由は次のとおりです。

  1. 自動クリーンアップはかなり安全ですが、プログラムは手動で行う必要があります。
  2. ライブラリを作成していて、リソースがオブジェクトによって所有されている場合と所有されていない場合があります。
  3. 自動クリーンアップが不可能であるか、何らかの形で危険な場合。
  4. 自動クリーンアップが取るに足らないものであり、誰かが手動で行うのを面倒にする価値がない場合。
于 2008-10-13T06:38:40.097 に答える