1

我正在尝试设置一个简单的基于 Mac 的 2D 平铺引擎,使用 2D NSMutableArray 进行映射。我正在使用 NSViewController 的子类,并引用地图对象(其中包含所述数组),并通过它将平铺数据的绘图请求传递给地图,以维护 MVC 完整性。但是,在我的 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 回答