2012-01-25 26 views
1

我试图设置一个简单的基于Mac的2D平铺引擎,使用2D NSMutableArray进行映射。为了保持MVC的完整性,我使用NSViewController的子类,引用地图对象(包含所述数组),并将瓦片数据的绘图请求通过它传递给地图。但是,我的应用程序似乎不会在我的drawRect代码开始触发前用对象填充数组。NSMutableArray在需要加载之前未被填充

每当我运行这个应用程序时,我的窗口无法加载,并且在调试器中收到错误消息“ - [__ NSArrayM objectAtIndex::index 0超出空数组边界”。据我所知,我的数组应该在视图实际显示或需要绘制之前用零完全初始化。

这里是我的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循环之前被调用 - 而obvio好吧,我的drawRect代码必须引用数组,然后从那里快速失败。我一定是做错了什么,或者做错了什么,但我无法弄清楚它可能是什么。

回答

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]; 
} 
+0

事实上,就是这样。非常感谢你指出今天早上我的大脑拒绝了什么。 :) –