11

重複の可能性:
Obj-C のメモリ管理を学ぶ
iPhone のメモリ管理についての最良の説明はどこですか?

私は C/C++ のバックグラウンドを持っており、Objective-C の動的な性質は私には少しなじみがありません。Objective-C のいくつかの基本的なメモリ管理テクニックについて誰かが私に指摘できる良いリソースはありますか? 元。保持、解放、自動解放

たとえば、Objective-C オブジェクトへのポインターを使用してそれを配列として扱うことは完全に違法ですか? データ構造に NSArray と NSMutableArray を使用する必要がありますか?

私はこれらがかなり初心者の質問であることを知っています.あなたが私に提供できる助けに感謝します.

4

10 に答える 10

19

ここに行きます

アプリケーションのメモリ管理とは、プログラムの実行時にメモリを割り当て、それを使用し、使用が終了したら解放するプロセスです。適切に作成されたプログラムは、使用するメモリをできるだけ少なくします。Objective-C では、限られたメモリ リソースの所有権を多くのデータとコードに分散する方法と見なすこともできます。このガイドの作業を完了すると、オブジェクトのライフ サイクルを明示的に管理し、不要になったときにオブジェクトを解放することによって、アプリケーションのメモリを管理するために必要な知識が得られます。

通常、メモリ管理は個々のオブジェクトのレベルで考えられますが、実際の目標はオブジェクト グラフを管理することです。実際に必要以上のオブジェクトがメモリにないことを確認したい...

于 2008-09-20T00:52:45.063 に答える
13

「heckj」や「benzado」によって提供される回答の場合のように、ほとんどの場合、間違いを犯したり、それらを不完全に説明したりするため、メモリ管理の基本的なルールを繰り返すことは一般に役に立ちません...

メモリ管理の基本的なルールは、メモリ管理ルールの Apple のドキュメントに記載されています。

「www.stray-bits.com」からの回答に相応しい:「所有していない」メソッドから返されたオブジェクトが「自動解放」されていると述べることも、せいぜい誤解を招くものです。通常、何かが「自動解放」されているかどうかという観点から考える必要はありませんが、単にメモリ管理規則を考慮して、返されたオブジェクトを所有しているかどうかをそれらの規則に従って判断する必要があります。もしそうなら、あなたは所有権を放棄する必要があります...

1 つの反例 (自動解放されたオブジェクトの観点から考える) は、 などのメソッドに関連するパフォーマンスの問題を検討している場合ですstringWithFormat:。通常(1)、これらのオブジェクトの有効期間を直接制御することはできないため、これらのオブジェクトは比較的長い間保持され、アプリケーションのメモリ フットプリントが不必要に増加する可能性があります。デスクトップではこれはほとんど影響しないかもしれませんが、より制約のあるプラットフォームでは重大な問題になる可能性があります。したがって、すべてのプラットフォームでalloc/initパターンを使用することがベスト プラクティスと見なされ、より制約の多いプラットフォームでは、可能であればオブジェクトの自動解放につながるメソッドを使用しないことを強くお勧めします。

(1) 独自のローカル自動解放プールを使用して制御できます。詳細については、Apple の Memory Management Programming Guideを参照してください。

于 2008-09-28T20:54:03.803 に答える
2

ルールは次のとおりです。

  1. allocまたはを呼び出してオブジェクトを作成する場合は、オブジェクトcopyを所有しており、完了したらオブジェクトを作成する必要がありreleaseます。
  2. オブジェクトを作成しなかったが、制御が実行ループに戻る前にオブジェクトが確実に保持されるようにしたい場合(または、単純にするために、メソッドが戻った場合)、retainメッセージを送信し、release後で完了したときに送信します。
  3. オブジェクトを作成してメソッドから返したい場合は、オブジェクトを解放する必要がありますが、呼び出し元がオブジェクトを見る機会を得る前にオブジェクトを破棄したくはありません。したがって、autorelease代わりに送信します。これにより、自動解放プールに配置されます。自動解放プールは、制御がプログラムのイベントループに戻ると空になります。他の誰もオブジェクトを保持していない場合、オブジェクトの割り当ては解除されます。

配列に関しては、次のようなことを自由に行うことができます。

NSObject *threeObjects[3];

threeObjects[0] = @"a string";
threeObjects[1] = [NSNumber numberWithInt:2];
threeObjects[2] = someOtherObject;

とにかくNSArrayを使用する理由:

  • NSArrayは、オブジェクトを追加するときにオブジェクトを保持し、削除するときにオブジェクトを解放しますが、プレーンなC配列では、それを自分で行う必要があります。
  • 配列をパラメーターとして渡す場合、NSArrayはそれに含まれるオブジェクトの数を報告できます。プレーンなC配列では、数も渡す必要があります。
  • 1行に角括弧の意味を混在させると奇妙に感じます。

    [threeObjects[0] length]

于 2008-09-24T09:11:10.353 に答える
2

配列の場合は、ポインターを使用して自由に反復してください。通常の配列は引き続き C によって管理されます。NSArray の場合は、NSArray のドキュメントを参照してください。特定の方法で行うように言われたら、その方法で行います。OS X について書くときは、本に従ってください。

于 2008-09-20T01:20:06.137 に答える
2

Objective-C は C の単なるスーパーセットです。C でできることはすべて Objective-C でも有効です。

于 2008-09-20T03:53:10.917 に答える
2

確かに配列を使用して、独自のメモリ管理を行うことができます。最大のコンポーネントは、NSObject サブクラスを作成する場合、[XXX alloc] メソッドを使用して作成する場合、または [xxx copy] を使用して別のコピーから取得する場合は、次のことを行う責任があります。それを関連するリリースと一致させます。

どこからでも変数を取得し、実行中の即時の使用以上にそれを保持する場合は、必ず [... 保持] を呼び出すようにしてください。

リンクhttp://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.htmlにはすべての詳細が含まれており、間違いなく最初に読む場所です。

于 2008-09-20T04:01:20.803 に答える
1

Cスタイルの配列を使用してオブジェクトを格納し、ガベージコレクションを使用する場合は、そのメモリにを割り当て、NSAllocateCollectable(sizeof(id)*size, NSScannedOption)その変数に。としてタグを付ける必要があることに注意してください__strong

このようにして、コレクターはオブジェクトを保持していることを認識し、その変数の存続期間中、そこに格納されているオブジェクトをルートとして扱います。

于 2008-10-01T18:42:22.360 に答える
1

別の初心者として、私はスタンフォード iOS レクチャーが非常に役立つことを発見しました: http://itunes.apple.com/itunes-u/developing-apps-for-ios-hd/id395605774

デモで実際の概念を示しているので良いです。一般的に、誰かが私に話しかける方が、ただ読むよりも吸収力が高いことがわかります。

これは間違いなく、さまざまな情報源から学び、再学習しなければならないトピックの 1 つだと思います....頭に叩き込むだけです。

于 2011-01-04T16:17:42.753 に答える
1

たとえば、Objective C オブジェクトへのポインターを使用してそれを配列として扱うことは完全に違法ですか?

配列でない場合は、はい。

データ構造に NSArray と NSMutableArray を使用する必要がありますか?

いいえ。C 配列を使用できます。また、C++ STL ベクトルを使用できるはずです (ただし、私は C++ を使用していないため、具体的な方法はわかりません)。

しかし、使用しない理由はありませんNS{,Mutable}Array。Cocoa フレームワークを恐れる必要はありません。彼らはあなたの友達です。

NS{,Mutable}Setやなどの他のコレクション タイプも忘れないでくださいNS{,Mutable}Dictionary

于 2008-11-10T16:39:39.440 に答える
0

NSString + (NSString *)stringWithFormat: (基本的に、オブジェクトを自分で割り当てるのではなく、ユーザーに代わってオブジェクトを割り当てるヘルパー メッセージ) のようなクラス メッセージの場合、結果のオブジェクトは自動的に解放されることに注意してください。明示的に保持します。

于 2008-09-22T14:02:49.827 に答える