1

通常CGColorを含む次の配列があります。

_strokeColors = [[NSArray alloc] initWithObjects:NULL,NULL,NULL,NULL, nil];

この配列と並行して実行される他の配列 (つまり_fillColors_mutuablePaths) があり、同じ量の値があります。これらすべての配列をループしてデータをチェックしますが、この特定の例ではすべて_strokeColorsが NULL でなければなりません。ただし、上記の配列のサイズが 0 であることに気付きました。

すべての値に対して NULL を読み取る必要があるこのような配列を初期化するためのパターンは何ですか?

4

4 に答える 4

10
_strokeColors = [[NSArray alloc] initWithObjects:[NSNull null],[NSNull null],[NSNull null],[NSNull null], nil];

トリックを行う必要があります。

于 2012-09-19T07:30:18.723 に答える
3

Cocoaでは、実際にNULLは使用されませんが、通常、標準のCポインターが使用される場合のために予約されています。

Objective-CもCであるため、これはもちろん単なる慣例ですが、便利なものです。NSString*ポインタをnil、に、char*またはvoid*ポインタをに設定しNULLて、違いに一目で気付くことができます。

さらに、Cocoaでは、コレクション(配列、辞書、セット)はnil値を保持できないため、他の投稿者が指摘しているように、プレースホルダー、つまりを使用する必要があります[NSNull null]

[NSNull null]ただし、これはプレースホルダーであり、コレクションはオブジェクトしか保持できないため、このプレースホルダーは標準のObjective-Cオブジェクトでもあることに注意してください。

したがって、条件ステートメントで使用する場合は、適切にテストする必要があります。たとえば、次のようになります。

id myVar = [NSNull null];

// Stuff...

if ( myVar == [NSNull null] ) {
     // myVar has not been changed, do something
}

NULLこれは、条件ステートメントで値を直接テストできる標準のCイディオムとは異なります。

void *myPointer = NULL;

// Stuff...

if ( myPointer ) {
    // More stuff if pointer uninitialized
}

また、演算子を[NSNull null]使用して変数の等価性をテストすることが突然大丈夫なのはなぜだろうと思うかもしれません。==これは、[NSNull null]がシングルトンであり、メモリ内で常に同じ位置にあることが保証されているためです(これが==この場合のテストです)。通常のオブジェクトではこれを行わないでください。

詳細については、ドキュメントをご覧ください。

于 2012-09-19T07:47:55.717 に答える
3

これはあなたのために働くはずです:

_strokeColors = [[NSArray alloc] initWithObjects:[NSNull null],[NSNull null],[NSNull null],[NSNull null], nil];

オブジェクト型は、配列またはその他のコレクションにのみ格納できます。

NULL、実際にはオブジェクトではありません。したがって、[NSNull null] を使用して、オブジェクト型として作成する必要があります。

于 2012-09-19T07:31:37.673 に答える
2

この方法を試してください -

_strokeColors = [[NSArray alloc] initWithObjects:[NSNull null],[NSNull null],[NSNull null],[NSNull null], nil];
于 2012-09-19T08:29:55.267 に答える