2012-04-23 8 views
3

配列内のオブジェクトのメモリ割り当てに関する質問があります。私はオブジェクトの配列を作成しようとしていますが、コンパイル時には、必要なオブジェクトの数を知る方法がないため、必要以上に多くのメモリを予約したくありません。オブジェクトの配列のメモリ割り当て - 私の理解は有効ですか?

私がしたいのは、必要に応じてメモリを割り当てることです。私がこれをやりたいのは、ユーザが "Add"ボタンをクリックし、配列が1つの追加オブジェクトだけ増加し、新しいオブジェクトのために必要なメモリが割り当てられたときです。私は宣言

まず、:Objective Cの私の初心者の理解で

(私は20年ほど前にプロのプログラマーだった、そしてごく最近、再びコードを書くために始めている)私は、次のコードセグメントが出ています私のオブジェクト:(注:変数iが1の値で実施を開始し、[追加]ボタンがあるたびに増加しているユーザーは、[追加]ボタンをクリックしたときに

NSObject *myObject[1000]; // a maximum number of objects. 

はその後、それが割り当てコードでメソッドを実行しますクリック)

++i 
    myObject[i] = [[NSObject alloc] init]; 

このように、1000個の配列オブジェクト全体ではなく、実際に必要なオブジェクトにのみメモリを割り当てたいと考えています。

これを正しく解釈していますか?言い換えれば、私の解釈では、宣言に記載された配列要素の数は、その時点で割り当てられているメモリの量ではなく、配列要素の最大数です。また、この正しい、そして理論的には、宣言:

NSObject *myObject[10000]; 

が宣言よりも、それ以上のメモリを引っ張らないでしょう:

NSObject *myObject[5]; 

誰かが私が正しく、このプロセスを理解していたことを確認することができ、私を啓発私はこれが私の心の中に混ざっている場合。 :)

ありがとう!

+0

なぜNSMutableArrayまたはCFMutableArrayを使用しないのですか?オブジェクトを効率的に追加します。 CFArrayのソースは次のとおりです。http://www.opensource.apple.com/source/CF/CF-635/CFArray.c –

+0

このチップをありがとう。私はそれがおそらく私がそれをやるべき方法だと確信しています。私は今までそれらのいずれかを聞いていなかった。奇妙なことに、私はおそらくホイールを再発明していることを知っていますが、理論的には、メモリ割り当てについての私の理解は正確ですか? –

+0

Objective-CオブジェクトのC配列を使用しないでください。それは悪い考えです。言語によって提供される配列オブジェクトを使用します。私はObjective-Cの本を読むことを強くお勧めします。最高のもの(IMHO)はStephen Kochanの[Programming In Objective-C](http://www.amazon.com/dp/0321811909/)です。 –

答えて

3

ご理解の方が大丈夫です。あなたが行うと:

NSObject *myObject[1000];

をすぐにNSObjectインスタンスへのポインタ1000年にストレージを割り当てます。 NSObjectインスタンスは、[[NSObject alloc] init]までは割り当てられません。

NSObject *myObject[10000]を実行すると、10,000ポインタが5つのポインタより多くのメモリを必要とするため、NSObject *myObject[5]よりも多くの領域が消費されます。

は、実際にNSObjectインスタンスによって消費される空間は、それを指すポインタによって消費される4つのバイトよりも著しく大きくなるものの、両方のものは、空間、NSObjectへのポインタ、およびNSObjectインスタンス自体を消費することに注意してください。

おそらくもっと重要なことは、Cocoaの動的オブジェクト割り当てを管理するためのより良い方法があることです。内蔵のNSMutableArrayクラスを使用してください。Like:

NSMutableArray* objects = [[NSMutableArray alloc] init]; 
[objects addObject: [[[NSObject alloc] init] autorelease]]; 
+0

優秀な説明。ありがとう。私はポインタ自体にメモリが割り当てられていたという事実を完全に忘れていました。 本質的に、オブジェクトは基本的にデータベースレコードの一種です。一連の変数といくつかのメソッドを含むNSオブジェクトです。 –

+0

今は、アクセサメソッドを使用してオブジェクト内の変数にアクセスできます。 x = [myObject var]; myObjectを配列オブジェクトに追加する場合、myObjectのアクセサメソッドを使用する簡単な方法はありますか?私はそれが次の行に沿ったものだと確信しています: x = [[オブジェクトのインデックス] var]; –

+0

はい、それは近いです。 'x = [[object objectsAtIndex:] var]'です。 [リファレンスドキュメント](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html)が役立つかもしれません。 – aroth

4

なぜNSMutableArrayを使用しないのですか?あなたはinitWithCapacityを使うこともできますし、単に[NSMutableArray array]を使って割り当てることもできます。オブジェクトを追加したり削除したりすると、それは大きくなり縮小します。例:

NSMutableArray *array = [NSMutableArray array]; 
NSObject *object = [[NSObject alloc] init]; 

[array addObject:object]; // array has one object 
[array removeObjectAtIndex:0]; // array is back to 0 objects 

// remember to relinquish ownership of your objects if you alloc them 
// the NSMutable array was autoreleased but the NSObject was not 
[object release]; 
+0

NSMutableArrayとNSArrayのドキュメントをチェックして、他のクールな機能をすべて確認してください。 https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html –

+0

NSArrayは、deallocの呼び出しを受け取ると、すべてのオブジェクトを解放します。したがって、たとえばNSArray型の合成プロパティがある場合は、その内容だけでなくNSArrayを '-dealloc'で解放すればよいのです。 –

+0

@JackLawrence、正しいですが、オブジェクトのallocを呼び出すと、保持カウントが1増加します。NSArrayにそのオブジェクトを追加すると、保持カウントも2に増えます。オブジェクトの削除時に[オブジェクトの解放]を呼び出さなかった配列からのオブジェクトの保持は1にカウントを保持したままにしておき、システムによってメモリが再利用されるのを防ぎます。 –

関連する問題