マッピング目的で 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 コードはそこから続き、すぐに失敗します。私は何か間違ったことをしているに違いありませんが、それが何であるかはわかりません。