5

私がそれを理解する方法は、Objective Cの特別なことの1つは、メッセージをNULLに送信でき、クラッシュする代わりにそれらを無視することです。

要求されたインデックスが範囲外の場合、NSRangeExceptionを引き起こすのではなく、NSArrayがNULLオブジェクトを返さないのはなぜですか?

私がObjectiveCとNSArrayに期待することは次のとおりです。

NSArray *array = [NSArray arrayWithObjects:@"Object 1", @"Object 2", @"Object 3", nil];

for (int i = 0; i < 5; i++) {
    NSString *string  = [array objectAtIndex:i];

    if (string) {
        NSLog(@"Object: %@",string);
    }
}

オブジェクトを含まない配列のインデックスにアクセスできるようにし、単にNULLを返します。次に、オブジェクトが存在するかどうかを確認できます。オブジェクトがインスタンス化されているかどうかを確認するなど、他の場所でもこれを行うことができます。

NSArray *array;

if (!array) {
    array = [NSArray array];
}

これは理論に基づいた質問だと思いますが、興味があります:)

4

2 に答える 2

10

nilへのメッセージは言語レベルの機能であり、フレームワークAPI機能ではありません。

それNSArray(および他のクラス)は、プログラマーのエラーがAPIの設計時に行われた意識的な設計上の決定であることを示す例外をスローします(〜1993)。ケビンとリチャードの両方が示しているようnil eats messageに、とにかく間違いではありませんが、out of bounds入力が間違っている場合が非常に多いです。

どこに線を引きますか?substringWithRange:古い入力を受け入れる必要がありますか?どうsetObject:atIndex:ですか?

NSArray @throw on bounds例外を作成するindexOfObject:ことにより、APIの一貫性が保たれます。 範囲外のインデックス(または範囲)はすべてになり@throwます。

于 2012-05-21T20:12:04.920 に答える
2

を使用してNSMutableDictionary、実行しようとしていることを実行できます。キーをNSNumberインデックスに設定します。objectForKey存在しないキー(想像上の範囲外または削除された)を呼び出すと、nilが返されます。

于 2012-05-21T20:12:39.490 に答える