对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。
任何想法在这里有什么问题?关于我的残酷行为的其他任何评论?
感谢。
答案 0 :(得分:3)
您是否在initWithDimension中分配并初始化了square变量?
答案 1 :(得分:2)
您面临的核心问题是:在您发布的代码中,您永远不会将对象引用分配给game_board.squares
,因此它会隐式初始化为nil
。当您在addObject:
上致电nil
时,没有任何反应。这是Objective-C语言中定义的行为。因此,您应该在添加对象之前添加squares = [[NSMutableArray alloc] initWithCapacity:boardSize*boardSize]]
形式的分配。
您应该使用initWithDimensions:
方法初始化您的主板。这就是创建一个类的重点 - 封装对象行为。由于Board
是Square
个对象的管理者,因此应初始化并管理它们。
在风格上,类名最好是Pascal-cased,这意味着每个单词都是大写的:MyClassName
。 (在这种情况下,首选Board
至board
和Square
至square
。)
答案 2 :(得分:1)
我的猜测是game_board.squares
为空。因此,向它传递消息(addObject)在循环内部不执行任何操作。 objectAtIndex
也没有做任何事情。
你能发布方括号的init
代码吗?