对象数组

时间:2010-05-18 01:14:42

标签: objective-c xcode

对Objective-C和整个Mac平台完全彻底的新手,所以请不要惹我生气=)。基本上我正在尝试创建一个简单的游戏。游戏有一个我创建了一个类的板,一个板由正方形组成,我也创建了一个类(分别为板和方块)。

在我的视图控制器中,我正在尝试实例化一块电路板并将boardSize ^ 2方块添加到所述对象中。 board包含一个NSMutableArray * square。

我还创建了一个方便方法来设置一个名为initWithDimension的NSNumber * boardSize。

在我的touchesBegan处理程序中,我有以下内容:

board *game_board = [[board alloc] initWithDimension:10];   
int size = [game_board.boardSize intValue];

for(int i = 0; i <= size; i++) {
    square *s = [[square alloc] init];
    [game_board.squares addObject:s];
    [s release];
}

NSLog(@"%i", size);
NSLog(@"%@", [game_board.squares objectAtIndex:0]);

...我得到10(按预期)然后(null)。这对于经验丰富的开发人员来说可能是显而易见的,我只是努力解决它并放弃了一个小时。我已经尝试了没有[s发布],同样的结果。我还导入了square.h和board.h。

任何想法在这里有什么问题?关于我的残酷行为的其他任何评论?

感谢。

3 个答案:

答案 0 :(得分:3)

您是否在initWithDimension中分配并初始化了square变量?

答案 1 :(得分:2)

  1. 您面临的核心问题是:在您发布的代码中,您永远不会将对象引用分配给game_board.squares,因此它会隐式初始化为nil。当您在addObject:上致电nil时,没有任何反应。这是Objective-C语言中定义的行为。因此,您应该在添加对象之前添加squares = [[NSMutableArray alloc] initWithCapacity:boardSize*boardSize]]形式的分配。

  2. 您应该使用initWithDimensions:方法初始化您的主板。这就是创建一个类的重点 - 封装对象行为。由于BoardSquare个对象的管理者,因此应初始化并管理它们。

  3. 在风格上,类名最好是Pascal-cased,这意味着每个单词都是大写的:MyClassName。 (在这种情况下,首选BoardboardSquaresquare。)

答案 2 :(得分:1)

我的猜测是game_board.squares为空。因此,向它传递消息(addObject)在循环内部不执行任何操作。 objectAtIndex也没有做任何事情。

你能发布方括号的init代码吗?