2

次のコードでは、メソッドの戻り値の型である NSArray ではなく NSMutableArray を返しても、警告やコンパイル エラーは発生しません。

しかし、次のコードのように -copy メソッドを使用して戻り値を NSArray に変換するのは良い習慣ですか?
または、NSMutableArray を返す必要がありますか?

+(NSArray *)returnImutableArray {
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    [arr addObject:@"a"];
    [arr addObject:@"b"];

    //return arr; // no warning
    return [arr copy];
}
4

3 に答える 3

6

これは基本的に個人の好みだと思います。配列を返す前にコピーすると、(おそらく小さい) パフォーマンスが低下します。利点は、結果の突然変異を完全に防ぐことができることです。しかし、私は通常トラブルに行きません。メソッドの宣言された戻り値の型は不変の NSArray であるため、(NSMutableArray にキャストすることによって) それを防ぐために道を外れない限り、コンパイラはそれに対して NSMutableArray の変更メソッドの 1 つを呼び出そうとすると警告を発します。

要するに、これは個人的な好みであり、個人的には不変のコピーを気にすることはありません。

于 2012-08-27T14:51:21.683 に答える
0

これはすべて、配列で何を達成したいかによって異なります。

返された配列を本当に変更したくない、または変更する必要がない場合は、NSArray として返します。コピーせずに、配列として返すこともできます。

どちらの場合も、メモリ管理を忘れないでください。

保持カウントが 0 を超えるものを返すべきではありません。

+(NSArray *)returnImutableArray {
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    [arr addObject:@"a"];
    [arr addObject:@"b"];

    NSArray * returnArray = [NSArray arrayWithArray:arr];
    [arr release];
    //return arr; // no warning
    return returnArray;
}

または、次のようにすることもできます。

+(NSArray *)returnImutableArray {
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    [arr addObject:@"a"];
    [arr addObject:@"b"];
    //return arr; // no warning
    return [arr autorelease];
}

NSMutableArray は NSArray を拡張するため、コピーする必要はありません。コピーしてもコードが壊れることはありません。

于 2012-08-27T14:52:11.903 に答える
0

copyデフォルトでは、内部可変インスタンスの不変を返します。だけでなくNSArray、他にもいくつかのタイプがあります。

可変オブジェクトが飛び交うのは望ましくありませんが、具象として扱う限り、可変オブジェクトが変化しても問題ありません。

shared の場合、浅いコピーを最小限に抑えるため、より良いデフォルトだと思います。つまり、結果を取得してcopyプロパティである 1 つまたは複数のオブジェクトに割り当てる場合、それらのすべてのアクションは、効果的に実行できる場合、具体的な浅いコピーを作成する必要がありretainます。これは、プロパティを宣言するときcopyよりも、これらの型のプロパティを優先する必要があるのと同じ理由です。retain

場合によっては、そのスコープが限定されており、ミュータブルが外に出ないことを知っているだけです。その場合、わざわざコピーを作成する必要はないかもしれません。

于 2012-08-27T14:52:31.533 に答える