391

で NSMutableArray を NSArray に変換するにはどうすればよいですか?

4

9 に答える 9

520
NSArray *array = [mutableArray copy];

Copy不変のコピーを作成します。Apple はさまざまな最適化を行うことができるため、これは非常に便利です。たとえばcopy、不変の配列に送信すると、オブジェクトのみが保持され、 が返されますself

ガベージ コレクションまたは ARC を使用しない場合-copyは、オブジェクトが保持されることに注意してください。

于 2009-11-20T08:20:16.593 に答える
361

AnNSMutableArrayはのサブクラスであるNSArrayため、常に変換する必要はありませんが、配列を変更できないようにするNSArray場合は、自動解放するかどうかに応じて、次のいずれかの方法を作成できます。

/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];

/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];

編集: GeorgSchöllyが提供するソリューションは、それを行うためのより良い方法であり、特にARCがあり、自動リリースを呼び出す必要がないため、はるかにクリーンです。

于 2009-11-20T08:08:02.083 に答える
18

このコードを試してください---

NSMutableArray *myMutableArray = [myArray mutableCopy];

NSArray *myArray = [myMutableArray copy];
于 2012-09-13T08:15:17.103 に答える
0

可変性を介して配列を構築していて、不変バージョンを返したい場合は、可変配列を継承を介して「NSArray」として単純に返すことができます。

- (NSArray *)arrayOfStrings {
    NSMutableArray *mutableArray = [NSMutableArray array];
    mutableArray[0] = @"foo";
    mutableArray[1] = @"bar";

    return mutableArray;
}

呼び出し元が (技術的にはまだ変更可能な) 戻りオブジェクトを不変の NSArray として扱うことを「信頼」している場合、これは より安価なオプションです[mutableArray copy]

アップルは同意します:

メッセージの受信者は、受信したオブジェクトを変更できるかどうかを判断するために、戻り値の正式な型に依存する必要があります。たとえば、不変として型指定された配列オブジェクトを受け取った場合、それを変更しようとすべきではありません。クラスのメンバーシップに基づいてオブジェクトが変更可能かどうかを判断することは、プログラミングの実践として受け入れられるものではありません。

上記のプラクティスについては、ここで詳しく説明します。

ベスト プラクティス: 戻り値の型が NSArray の場合、mutableArray.copy または mutableArray を返す

于 2016-03-24T18:35:39.123 に答える
0

私はswift 3で答えを探していましたが、この質問は検索の最初の結果として表示され、そこから答えが得られたので、ここにswift 3コードがあります

let array: [String] = nsMutableArrayObject.copy() as! [String]
于 2017-02-20T13:29:27.850 に答える