1

Apple のメモリ管理ガイドを読み、アプリケーションで適切なメモリ管理を行うために従うべきプラクティスを理解していると思います。

現在、コードにメモリ リークはないようです。しかし、コードが複雑になるにつれて、オブジェクトの割り当てと割り当て解除を追跡するために従うべき特定のパターンがあるかどうか疑問に思います。

タイプのアクティブなオブジェクトの数のカウントを含む、アプリケーションの実行全体に存在するある種のグローバル オブジェクトを作成することは理にかなっていますか? 各オブジェクトは、init メソッドでそのタイプのカウントをインクリメントし、dealloc でデクリメントできます。グローバル オブジェクトは、特定のタイプのカウントがゼロかそうでないかを適切なタイミングで確認できます。

編集: リークの使用方法と、Xcode を使用してプロジェクトを分析する方法も認識しています。この投稿の理由は、リークによって検出されない、または簡単に分析できないケースを追跡することです。

編集: また、グローバル オブジェクトをチェックする単体テストを実行することにより、ビルドでリークを早期に検出できるように、このようなものを用意することは理にかなっているようです。私は、経験の浅い客観的な c プログラマとして、これに関する他の人の意見から恩恵を受けると思います。

4

2 に答える 2

2

Each object could increment the count of their type in their init method, and decrement it in dealloc.

To do that right, you'll have to do one of the following: 1) override behavior at some common point, such as NSObject's -init or , or 2) add the appropriate code to the designated initializer of every single class. Neither seems simple.

The global object could verify at appropriate times if the count of a particular type is zero of not.

Sounds good, but can you elaborate a bit on "appropriate times"? How would you know at any given point in the life of your program which classes should have zero instances? You'd have a pretty good idea that there should be no objects at the end of the program, but Instruments could tell you the same thing in that case.

Objective-C は、メモリ管理をより簡単にするためにいくつかのステップを踏んでいます。基本的にオブジェクトを管理するため、できる限りプロパティと合成アクセサーを使用してください。最近の改善点は ARC で、ほとんどのメモリ管理タスクの自動化をさらに進めています。基本的に、メモリ管理呼び出しを配置する場所をコンパイラに判断させます。これは、ガベージ コレクターのないガベージ コレクションのようなものです。新しいツールを発明しようとする前に、それらのツールをうまく使うことを学びましょう。

于 2012-01-24T05:02:52.540 に答える
1

その道を行かないでください...それは単一継承の苦痛です。最も重要なことは、グローバルカウンターを作成する必要があると考える前に、それらを習得する必要がある優れたツールを自由に使用できることです。グローバル カウンターは、いくつかのツールに既に存在します。それらを学んでください。

それと戦う方法は、それが書かれたときにすべてを正しくバランスさせ、管理する方法を学ぶことです. 後から考えると非常に簡単です。

ARC は別のオプションです。実際には、理解を先延ばしにするだけです。

最初の「設計パターン」は、可能な場合はrelease代わりに使用することをお勧めしますautorelease(ただし、一般的には過剰リリースの場合により便利です)。

次に、リークの計器/ユーティリティを定期的に実行し、すべてのリーク/ゾンビをすぐに修正します。

3 つ目は、既存のツールを学習しながら学習することです。これらのツールは、すべての割り当てとすべての参照カウントのバックトレースを記録するなど、非常にクレイジーなことを行うことができます。プログラムの実行を一時停止して、存在する割り当て、割り当てカウント、バックトレース、およびその他のあらゆる種類の統計を表示できます。

于 2012-01-24T05:00:47.137 に答える