好吧所以我最近决定尝试自学Objective-C(我对iPhone开发很感兴趣),但我之前从未使用过C或其任何衍生产品,因此遇到了一些问题。 我决定开始写一个非常基本的卡应用程序,创建一副卡片,洗牌,然后使用UIButtons在屏幕上显示卡片,但是我的洗牌算法有问题。每次调用它时都会出现EXC_BAD_ACCESS错误,我知道这意味着我的代码存在一些绝对错误,但我无法弄清楚它是什么。
- (void) randomize {
NSMutableArray *tmpDeck = [[NSMutableArray alloc] init];
for(Card *tmp in _cards) {
BOOL didInsert = NO;
while(!didInsert) {
NSUInteger random = arc4random_uniform(54);
if([[tmpDeck objectAtIndex:random] isEqual:nil]) {
[tmpDeck insertObject:tmp atIndex:random];
didInsert = YES;
}
}
}
_cards = tmpDeck;
_hasBeenRandomized = YES;
}
_cards是一个指向NSMutableArray的指针,其中包含未对齐的卡片对象,而_hasBeenRandomized是一个布尔值(显然),用于跟踪卡片组是否已被随机化。
我已经尝试使用调试器来确定这里到底发生了什么,但是如果没有我的程序崩溃,我甚至无法进入该方法。这让我相信问题必须来自第一行,但它只是一个简单的NSMutableArray创建,所以我不知道它是怎么回事。从viewDidLoad中调用此方法。这是当前viewDidLoad方法的全部内容。
- (void)viewDidLoad
{
[super viewDidLoad];
_deck = [[Deck alloc] init];
[_deck randomize];
}
任何和所有帮助将不胜感激。对不起,如果答案显而易见。
答案 0 :(得分:1)
这是因为您尝试插入尚不存在的索引。您需要根据卡所需的数量初始化阵列中的数组。要么是这样,要么使用NSMutableDictionary,只需插入索引作为键的对象。
要添加另一个注释,在数组上调用initWithCapacity将无法解决此问题,因为这只是给出了大小的“提示”。您需要数组的count属性实际上至少与您尝试插入的索引一样大。如果你想做一个数组,那么你首先需要先在每个索引中填充一些东西。你可以用新的数组文字格式定义它,或者使用一个for循环来循环你需要的次数(你的最大索引)并在它的位置插入一个虚拟对象。
for (int i=0; i< _cards.count; ++i)
{
[tmpDeck insertObject:@"dummy" atIndex:i];
}
然后,在替换之前不检查'nil',而是检查它是否等于您插入的虚拟对象。这将为您提供一个可以插入任何这些索引的数组。我个人仍然可能将它们存储在NSMutableDictionary中。但是如果你需要在数组中用于其他目的,那么这是一种方法。
您还需要确保替换对象而不是插入,否则您将继续添加索引。
[tmpDeck replaceObjectAtIndex:random withObject:tmp];
如果仍然遇到相同的错误,请在调试器中设置断点并检查随机数是什么以及数组的数量是多少。如果您的随机数大于您的数组计数,那么您将收到此错误。