3

オブジェクトのインスタンスへのポインタの配列を使用したいのですが、必要な場合(つまり、怠惰な場合)にのみそれらのオブジェクトのインスタンスを作成したいと思います。配列はUIのテーブルに対応しているため、各配列インデックスはテーブルの行に対応しています。

NSMutableArrayを使用して、作成時にオブジェクトインスタンスへのポインターを保持したいと思います(これは、ユーザーがUIで対応する行を選択したときに発生します)。

テーブルの行が選択されている場合、対応する配列エントリがチェックされます。ポインタ値がnilの場合、インスタンスはまだ作成されていないため、その時点で作成され、オブジェクトポインタは対応するインデックス付き配列エントリに格納されます。

明らかに、これには最初にnilポインターの配列から始める必要がありますが、objCではNSArrayにnilポインターを配置できません。

配列のインデックスはテーブルの行に対応していないため、作成時にオブジェクトを配列に追加することはできません。

ここで最高のobjCソリューションは何ですか?

4

3 に答える 3

7

Objective Cの慣用的な解決策は、以下を使用することNSNullです。

NSNullクラスは、コレクションオブジェクト(nil値を許可しない)のnull値を表すために使用されるシングルトンオブジェクトを定義します。

を作成し、オブジェクトNSMutableArrayで埋めます。[NSNull null]

NSMutableArray *array = [NSMutableArray arrayWithCapacity:N];
for (int i = 0 ; i != 10 ; [a addObject:[NSNull null]], i++);

内のオブジェクトの有無を確認するときは、NSMutableArrayインデックスにあるオブジェクトを次のように比較します[NSNull null]。同じ場合は、実際のオブジェクトに置き換えます。それ以外の場合、実際のオブジェクトはすでに存在します。

if ([array objectAtIndex:index] == [NSNull null]) {
    MyRealObject realObject = [[MyRealObject alloc] init];
    [array replaceObjectAtIndex:index withObject:realObject];
}

**編集の概要**ループを使用して配列を初期化するために編集されました(bbumに感謝)。

于 2012-07-21T11:00:33.927 に答える
3

NSMutableArrayはスパース配列をサポートしていません。したがって、NSNullインスタンス(またはその他の「オブジェクトなし」マーカー)を使用して配列を事前にシードすることができます。何かのようなもの:

a = [NSMutableArray array];
for(int i = 0; i<numberNeeded; i++) [a addObject:[NSNull null]];

または、配列が本当にまばらになる場合は、代わりにある種のマップの使用を検討してください。NSMutableDictionaryは機能しますが、キー用のオブジェクトが必要であり、場合によっては、ボックス化/ボックス化解除のすべてが面倒です。または、CFDictionaryは、オブジェクト値で整数キーを使用するように簡単に構成できます。

辞書はインデックスによるルックアップでは明らかに低速ですが、そのパフォーマンスの違いがほとんどの場合(すべてではありません)問題を引き起こす可能性は低いです。

于 2012-07-21T18:17:34.283 に答える
0

どう[NSMutableArray arrayWithCapacity:numberOfRows]ですか?

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

于 2012-07-21T10:49:12.140 に答える