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钻石(数组)是一个实例变量
答案 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
数组。