8

それで、やっと Objective-C/Cocoa の本を払いのけました。Objective-C 2.0 にはガベージ コレクションが含まれるようになりましたが、メモリ管理に関する章はどれほど重要ですか?

ガベージ コレクションはどのくらいの違いをもたらしましたか?

4

6 に答える 6

9

メモリ管理は、理解することが依然として非常に重要です。古い OS をターゲットにしている場合は、メモリ管理を行う必要があります。古いライブラリを使用している場合は、メモリ管理を行う必要があります。Core Foundation レベルにドロップダウンする場合は、メモリ管理を行う必要があります (必要な場合とそうでない場合があります)。

iPhone 向けにプログラミングしている場合は、メモリ管理を行う必要があります。

Objective-C のガベージ コレクタは非常に優れています。使用できるのであれば、間違いなく使用する必要がありますが、まだすべてのプログラミング状況をカバーしているわけではありません。

于 2008-12-19T21:24:23.257 に答える
3

Cocoa Touch には GC がないため、iPhone プラットフォームをプログラミングしている場合は、retain/release を知る必要があります。

Core Foundation、Core Graphics、ほとんどの Core Services、またはその他の CF ベースの API を使用する場合は、CF 派生オブジェクトはデフォルトで GC されないため、retain/release を知る必要があります (そして、とにかく、明示的にピックアップのためにそれらを出してください)。

POSIX API またはその他のコア サービスを使用する場合は、メモリの割り当て/解放の管理について知っておく必要があります。参照カウントすら得られません。(例外: 参照カウントも持つアイコン サービス。Carbon から生まれた API はめちゃくちゃです。)

つまり、一言で言えば:はい。

于 2008-12-20T01:54:31.073 に答える
3

Distributed Objects、PyObjC (Python-Objective-C ブリッジ) プラグイン、CoreImage (少なくとも最後に聞いたことがありますが、これは修正されている可能性があります) などの一部の Cocoa テクノロジは、ガベージ コレクションではうまく機能しません。これらのテクノロジを使用している場合でも、従来のメモリ管理を使用する必要があります。もちろん、他の人が言っているように、OS X 10.4 や iPhone をコードでサポートしている場合は、従来の Cocoa メモリ管理 (参照カウント) を使用する必要があります。

一方、新しいGCは非常に優れています。ただし、無料のランチではありません。他のテクノロジーと同様に、GC システムのセマンティクス、そのパターン、および制限を理解する必要があります。

多くのサードパーティ フレームワークはまだ GC をサポートしていない可能性があるため、参照カウント システムを理解することをお勧めします。Apple のメモリ管理ガイドに記載されているオブジェクトの所有権に関する簡単なルールに従えば、いつでも問題ありません。

于 2008-12-19T21:33:30.087 に答える
2

場合によります。10.4 のユーザーを無視するつもりなら、心配する必要はないかもしれません。ただし、Objective-C 2.0 は 10.4 以下では使用できないため、これらのプラットフォームでのメモリ管理について心配する必要があります。

とはいえ、メモリ管理は常に有用なスキルであり、とにかく Cocoa ではそれほど難しくないため、習得するのに悪いスキルではありません。

于 2008-12-19T21:21:31.623 に答える
2

Cocoa メモリ管理は、特定の状況では依然として有用であるため、その基礎となる概念について学ぶ価値があるでしょう。たとえば、iPhone OS はガベージ コレクションをサポートしていません。手動のメモリ管理を使用することが有利な状況が他にもあるかもしれません。そのような選択ができると便利です。

于 2008-12-19T21:25:27.357 に答える
1

Cocoa の優れたメモリ管理の概念を理解すると、一般的なメモリ管理の概念を理解するのに役立ちます。自動解放の概念をいくつかの C++ プロジェクトにコピーしたところ、うまく機能しました。Apache と Subversion は、autorelease も使用する他のソフトウェアの例です。

個人的には、retain/release/autorelease がちょうどいいレベルの抽象化だと思います。それは魔法ではないので、何か変なことをする必要があれば、簡単にできます。一方、ルールは非常に単純であるため、最終的にはメモリ管理について考える必要がなくなり、機能します。

これに加えて、上記のように、ガベージ コレクションをサポートするのはほとんどの Cocoa だけであり、作成するのは C であるため、Cocoa 以外で作成および/または使用するコードは手動で管理する必要があります。これには、CoreAudio、CoreGraphics などが含まれます。

(はい、CF オブジェクトは GC で動作しますが、オブジェクトごとに明示的に有効にした場合に限ります。GC-CF ルールを学ぶのは難しいと思いました)

要約すると、私自身はガベージ コレクターを使用したことはありません (C++ と CG が混在していたため、一度だけ使用したときは非常に苦痛でした)。私の知る限り、ほとんどの Cocoa コーダーは、 /release/autorelease を使用してください。

于 2008-12-21T12:25:13.733 に答える