web-dev-qa-db-ja.com

Objective-Cで文字列型の2次元配列を宣言する方法は?

Objective-Cで文字列型の2次元配列を宣言するにはどうすればよいですか?

25
ashish

最初に、クラスを使用して内部配列の文字列を保持するか、またはplistファイル(文字列の2D配列を簡単に作成できる)からそれをロードすることを検討します。

直接宣言の場合、いくつかのオプションがあります。 NSArrayを使用したい場合は、次のような構造を手動で作成する必要があります。

NSMutableArray *strings = [NSMutableArray array];
for(int i = 0; i < DESIRED_MAJOR_SIZE; i++)
{
    [strings addObject: [NSMutableArray arrayWithObject:@"" count:DESIRED_MINOR_SIZE]];
}

または、配列リテラルを使用して、次のようなimmutableバージョンを取得できます。

NSArray *strings = @[ @[ @"A", @"B", @"C" ], @[ @"D", @"E", @"F" ], @[ @"G", @"H", @"I" ] ]

その後、次のように使用できます。

NSString *s = [[strings objectAtIndex:i] objectAtIndex:j];

これは初期化するのが少し厄介ですが、NSArrayメソッドを使用したい場合は、この方法を使用します。

別の方法は、C配列を使用することです。

NSString *strings[MAJOR_SIZE][MINOR_SIZE] = {0}; // all start as nil

そして、次のように使用します。

NSString *s = strings[i][j];

これはそれほど厄介ではありませんが、値をretain/copyおよびreleaseに入れたり削除したりするときは注意する必要があります配列からそれら。 (もちろん、ARCを使用している場合を除きます!)NSArrayはこれを実行しますが、Cスタイルの配列では、配列を置き換えるために次のようなことを行う必要があります。

[strings[i][j] release];
strings[i][j] = [newString retain];

他の違いは、nilをCスタイルの配列に入れることはできるが、NSArraysには入れないことです。そのためにはNSNullを使用する必要があります。 NSStringのメモリ管理の詳細については、スタックオーバーフローの質問Cocoa:NSStringによるメモリ管理もご覧ください。

44
Jesse Rusak

文字列の2次元配列を宣言して初期化する場合は、次のようにします。

NSArray *myArray = [NSArray arrayWithObjects:
                       [NSArray arrayWithObjects:@"item 1-1", @"item 1-2", nil],
                       [NSArray arrayWithObjects:@"item 2-1", @"item 2-2", nil],
                       [NSArray arrayWithObjects:@"item 3-1", @"item 3-2", nil],
                       [NSArray arrayWithObjects:@"item 4-1", @"item 4-2", nil],
                       nil];

これには、不変の配列を提供するという利点があります。

12
Steve McLeod

私は自己宣伝をしているかもしれませんが、2D配列として簡単に使用できるようにNSMutableArrayのラッパーを書きました。 GitHubでCRL2DArrayとして入手できます。 https://github.com/tGilani/CRL2DArray

2
tGilani