7

すべて nil を指す可能性のあるポインターの配列を維持できるようにしたい状況があります。

Equipment *equipment[19];

ただし、オブジェクトのプロパティとしてポインターの配列またはダブルポインターを設定できないことがわかりました。

C スタイルの配列を使用できない場合の回避策は、NSArray オブジェクトを使用することです。だから私は次のようなことをしようとしました:

NSMutableArray *equipment = [NSMutableArray arrayWithCapacity: NUM_EQUIPSLOTS];
for (int i=0; i<NUM_EQUIPSLOTS; i++) {
    [equipment setObject: nil atIndexedSubscript: i];
}

ここでのアイデアは、後で何かを指す空のポインターの配列を持っているということです。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x246e012 0x1e4be7e 0x2421b6a 0x2421a20 0xebd02 0xde82b 0xc9d5a 0xcb6bd 0x4d525 0xc94fa 0xc8b6a 0xa18157 0xa18747 0xa1994b 0xa2acb5 0xa2bbeb 0xa1d698 0x3176df9 0x3176ad0 0x23e3bf5 0x23e3962 0x2414bb6 0x2413f44 0x2413e1b 0xa1917a 0xa1affc 0xc8526 0x1fa5)
libc++abi.dylib: terminate called throwing an exception

これは、C スタイルの配列と個々のオブジェクトを使用して非常に簡単に実行できることを知っています。次のようなばかげたものよりも、このようにしたいと思います。

Equipment *equipment0 = nil;
Equipment *equipment1 = nil;
Equipment *equipment2 = nil;
// ...
Equipment *equipment18 = nil;

これはおそらく NSArray モデル自体の構造に関係しています。これがなぜなのか、なぜ NSArray に nil オブジェクトを単純に追加または設定できないのか、誰かが説明してくれますか? 前もって感謝します。

4

2 に答える 2

10

「なぜ」は些細で満足のいくものではありません。NSMutableArrayオブジェクトを保持し、オブジェクトではないためnilです。ObjC では、オブジェクトとプリミティブ型が明確に区別されています。nilプリミティブ型です。CodaFi注意として、NSNullまたはNSPointerArrayを使用してこれらに対処できます。典型的な解決策はNSNull.

于 2013-03-28T01:05:49.670 に答える
5

正当な理由はありません。NSArrayオブジェクトへのポインターをNSMutableArray格納します。nilオブジェクトへのまともなポインタです。Java に相当するものはで、要素ArrayListを許可します。nullそれは単なるデザインの選択でした。

この設計上の選択の考えられる歴史的な理由の 1 つは、配列を作成して要素で埋める最も一般的な方法は-initWithObjects:...+arrayWithObjects:...varargs を使用して、ユーザーが与えたいと思うだけ多くの引数を取り、それを配列に入れる方法を使用することです。 . C の varargs では、引数の数を決定することは不可能であるため、引数の数を示すために選択した方法nilは、リストの終わりを知らせる「ターミネーター」として使用することでした。(数値を示す方法は他にもあります。たとえば、数値を最初の引数として渡すなどです。) この方法の欠点はnil、配列に入れたい "引数" の 1 つとして指定できないことです。リスト。

ただし、これらのメソッドは、配列を作成して要素で埋める唯一の方法ではありませんでした。空の配列を作成してそれぞれを個別に追加するか、-initWithObjects:count:またはメソッドを使用できます。これらは可変引数ではないため、ターミネータの問題+arrayWithObjects:count:はありませんでした。nil現在、-initWithObjects:count:さらに簡単にする配列リテラル構文 (内部的に呼び出す) もあります。要素を持ちNSArrayNSMutableArrayそれを許可することは完全に考えられます。要素を使用または追加nilできないというだけです。しかし、彼らはそうしないことにしました。-initWithObjects:...+arrayWithObjects:...nil

于 2013-03-28T04:44:07.387 に答える