1

マッピング目的で 2D NSMutableArray を使用して、単純な Mac ベースの 2D タイル エンジンをセットアップしようとしています。MVCの整合性を維持するために、マップオブジェクト(上記の配列を含む)への参照でNSViewControllerのサブクラスを使用し、それを介してタイルデータの描画要求をマップに渡します。ただし、drawRect コードの実行が開始される前に、アプリケーションが配列にオブジェクトを設定していないようです。

このアプリを記述どおりに実行するたびに、ウィンドウの読み込みに失敗し、デバッガーに「-[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array」というエラー メッセージが表示されます。私が知る限り、ビューが実際に表示される前、または描画する必要がある前に、配列をゼロで完全に初期化する必要があります。

これは、私の NSViewController サブクラスの -loadView メソッドです。

- (void)loadView
{
    currentMap = [[TestMap alloc] init];
    [super loadView];
}

これが私のマップオブジェクトのinitメソッドです:

- (id)init
{
    dimensions = NSMakeSize(15.0,20.0);
    tileset = [[TestTileset alloc] init];
    map = [NSMutableArray arrayWithCapacity:15];
    for (int i = 0; i == 14; i++)
    {
        NSMutableArray *tempRow = [NSMutableArray arrayWithCapacity:20];
        for (int j = 0; j == 19; i++)
        {
            NSNumber *tempID = [NSNumber numberWithInt:0];
            [tempRow addObject:tempID];
        }
        [map addObject:tempRow];
    }
    return self;
}

ブレークポイントの賢明な使用は、

[super loadView]

init がその for ループを開始する前に何らかの形で呼び出されています - そして明らかに、配列を参照する必要がある私の drawRect コードはそこから続き、すぐに失敗します。私は何か間違ったことをしているに違いありませんが、それが何であるかはわかりません。

4

1 に答える 1

2

==代わりに がある!=ため、どちらのforループも実行されません。ループは次のようにする必要があると思います。

for (int i = 0; i != 15; i++)
{
    NSMutableArray *tempRow = [NSMutableArray arrayWithCapacity:20];
    for (int j = 0; j != 20; j++)
    {
        NSNumber *tempID = [NSNumber numberWithInt:0];
        [tempRow addObject:tempID];
    }
    [map addObject:tempRow];
}
于 2012-01-25T21:22:33.710 に答える