3

NSArray および NSMutableArray+arrayWithArray:は、引数が nil の場合、nil ではなく空の配列を返します。

    NSLog(@"%@", [[NSArray arrayWithArray:nil] class]);
    NSLog(@"%@", [[NSMutableArray arrayWithArray:nil] class]);

出力:

    __NSArrayI
    __NSArrayM

ただし、この動作は Apple のドキュメントには記載されていません。

arrayWithArray:nil空の配列を返すという仮定に頼るのは安全ですか?
または、次のように空の配列を明示的に割り当てる必要があります。

    NSDictionary *dic = [[NSDictionary alloc] init];
    NSMutableArray *arr = [dic objectForKey:@"a"];
    if (!arr) {
        arr = [[NSMutableArray alloc] init];
    }
4

1 に答える 1

5

のドキュメントに+arrayWithArray:は次のように書かれています:

別の指定された配列内のオブジェクトを含む配列を作成して返します。

もちろん、nilは配列ではありませんが、[nil count]有効で を返す0ため、ここでは空の配列として扱われる可能性があります。

しかし、私はその事実に頼らず[[NSMutableArray alloc] init]、またはで空の配列を作成します[NSMutableArray array]

追加した:

+arrayWithArray:a などの無効な型で呼び出すと、NSStringもちろんプログラムは例外をスローします。しかし、エラーメッセージから

-[__NSCFConstantString count]: unrecognized selector sent to instance 0x69e4

count配列要素をコピーするために実際に使用される最初のメソッドであることがわかります。それはまた、それが で動作する理由も説明していnilます。

于 2012-08-26T06:16:44.647 に答える