3

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

私がやりたいのは、必要に応じてメモリを割り当てることです。これを行う方法は、ユーザーが「追加」ボタンをクリックすると、配列が1つの追加オブジェクトによって増加し、新しいオブジェクトに必要なメモリが割り当てられることです。

Objective C についての私の初心者の理解 (私は約 20 年前にプロのプログラマーであり、最近再びコードを書き始めたばかりです) で、次のコード セグメントを思いつきました。

まず、オブジェクトを宣言しました。

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

次に、ユーザーが [追加] ボタンをクリックすると、割り当てコードを使用してメソッドが実行されます (注: 変数 i は値 1 から始まり、[追加] ボタンがクリックされるたびに増加します)。

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

したがって、1000 個の配列オブジェクトすべてをすぐに割り当てるのではなく、実際に必要なオブジェクトにのみメモリを割り当てることを望んでいます。

これを正しく解釈していますか?つまり、宣言に記載されている配列要素の数は、その時点で割り当てられているメモリの量ではなく、配列要素の最大可能数であるという私の解釈は正しいですか? これが正しい場合、理論的には次の宣言になります。

    NSObject *myObject[10000];

宣言よりも多くのメモリをプルしません:

    NSObject *myObject[5];

誰かが私がこのプロセスを正しく理解していることを確認できますか?これが頭の中で混乱している場合は教えてください。:)

ありがとう!

4

2 に答える 2

4

NSMutableArrayを使用してみませんか?initWithCapacityを使用するか、[NSMutableArrayarray]を使用して割り当てることができます。オブジェクトを追加および削除すると、拡大および縮小します。例えば:

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]; 
于 2012-04-23T03:15:23.823 に答える
3

あなたの理解はほとんど正しいです。あなたがするとき:

NSObject *myObject[1000];

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

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

実際には、インスタンスによって消費されるスペースは、インスタンスを参照するポインターによって消費される4バイトよりも大幅に大きくなりますが、どちらもスペース、、へのポインターNSObject、およびインスタンス自体を消費することに注意してください。NSObjectNSObject

とにかく、おそらくもっと重要なことに、Cocoaで動的オブジェクト割り当てを管理するためのより良い方法があります。組み込みNSMutableArrayクラスを使用します。好き:

NSMutableArray* objects = [[NSMutableArray alloc] init];
[objects addObject: [[[NSObject alloc] init] autorelease]];
于 2012-04-23T03:12:39.067 に答える