NSMutableArray的count方法在表达式中调用时抛出异常

时间:2011-11-22 08:47:18

标签: objective-c xcode nsmutablearray nsarray

 if ([diamonds count] == 0) {
    [self toggleWinLevel];
}

当diamond是NSMutableArray并且toggleWinLevel是一个实例方法时,如果我运行这个应用程序,它会在EXC_BAD_ACCESS的这一行崩溃:

 if ([diamonds count] == 0) {

这绝对与我的数组有关,因为即使我将int或NSUInteger或NSNumber分配给我的数组的计数,这仍然会发生。我的NSMutableArray已分配并初始化。问题是什么?

更新1:

我已经在这个被调用的方法中分配并初始化了它,我有NSLog,它登录控制台进行证明:

    -(void)setUpObjects {

NSLog(@"Setting Up Objects"); // This is printed in my console

[levelNumberLabel setHidden:YES];
diamonds = [[NSMutableArray alloc] init];
rocks = [[NSMutableArray alloc] init];

if (levelNumber < 3) {

    diamonds = [NSMutableArray arrayWithObjects:@"1", nil];

} else if (levelNumber > 2 <= 4) {

    diamonds = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil];

} else if (levelNumber > 4 <= 6) {

    diamonds = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];

} else if (levelNumber > 6 <= 10) {

    diamonds = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil];

} else if (levelNumber > 10) {

    diamonds = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", nil];
}

if ([diamonds count] > 1 <= 2) {

    rocks = [NSMutableArray arrayWithObjects:@"1", @"2", nil];                 

} else if ([diamonds count] > 2 <= 5) {

    rocks = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil];

} else if ([diamonds count] > 5) {

    rocks = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];
}

[self drawObjects];
}

BTW钻石(数组)是一个实例变量

3 个答案:

答案 0 :(得分:2)

最有可能的是你过度释放钻石阵列,换句话说,数组对象已经被释放,你正试图为它调用一个方法。使用NSZombieEnabled = YES参数或使用Zombies的仪器。

答案 1 :(得分:2)

你第一次打电话:

diamonds = [[NSMutableArray alloc] init];

但后来打电话,例如:

diamonds = [NSMutableArray arrayWithObjects:@"1", nil];

第二个调用将为diamonds分配一个自动释放的对象,您需要保留该对象。

您的代码中存在不一致的情况,在第一次调用时,您有一个保留对象,而不是第二次调用中的自动释放对象。

答案 2 :(得分:2)

要么做ThomasW建议并保留新数组(但这会泄漏原始实例),或者只是将项目添加到数组中而不是创建新数组:

diamonds = [NSMutableArray arrayWithObjects:@"1", nil];

应该阅读

[diamonds addObjectsFromArray:[NSArray arrayWithObjects:@"1", nil]];

这会将对象添加到现有数组中,而不是创建新数组。

您已使用diamonds创建了alloc/init数组,并在if语句中将其重新创建为自动释放的变量。

这同样适用于您的rocks数组。