2

我是一个完全的菜鸟,需要我正在编写的方法的帮助。

该方法创建一副纸牌(使用 NSMutableArray)。我首先尝试随机加载数字 1-13 的数组(每个数字出现一次)。

当我运行一个简单的测试程序来打印数组中的值时,我得到一个“构建成功”,但是一旦程序启动就会出错。错误显示“[__NSArrayM insertObject:atIndex:]: object cannot be nil”。

一旦我明白我做错了什么,我就可以正确地扩展该方法。谢谢!

注意:这是我的第一篇文章。这种问题可以吗?

- (void) createDeck {

int r;
BOOL same;
deck = [[NSMutableArray  alloc]init];
NSNumber *randNum;// = nil;

randNum = [[NSNumber alloc]init];

[randNum  initWithInt: (arc4random()%13)+1];
[deck  addObject: randNum];          // First card added to deck

same = FALSE;

while (!same) {

    for (int i=1; i<13; i++) {

        same = FALSE;

        for (r=0; r<=i; r++) {

            [randNum  initWithInt: (arc4random()%13)+1];

            if ([deck  objectAtIndex:r] == [deck  objectAtIndex:i]) {

                same = TRUE;

            }

            [deck addObject: randNum];           // Next card added to deck

        }

    }
}

}

4

2 回答 2

3

你不能重新初始化 randNum:

NSNumber *randNum;// = nil;

randNum = [[NSNumber alloc]init];

[randNum  initWithInt: (arc4random()%13)+1];

并且第三行无论如何都缺少任务。做就是了:

NSNumber *randNum = [[NSNumber alloc] initWithInt:(arc4random()%13)+1];

并将其放在内部 for 循环中,如下所示:

BOOL same = FALSE;
NSMutableArray *deck = [[NSMutableArray  alloc] initWithCapacity:13];

[deck addObject:[[NSNumber alloc] initWithInt:(arc4random()%13)+1]]; // First card added to deck
while (!same) {
  for (int i = 1; i < 13; i++) {
    same = FALSE;
    for (int r = 0; r <= i; r++) {
        NSNumber *randNum = [randNum initWithInt:(arc4random()%13)+1]; // modern ObjC will assign a register for this outside the while loop, but restrict the variable's scope to the inner-most loop
        if ([deck objectAtIndex:r] == [deck objectAtIndex:i])
            same = TRUE;
        [deck addObject: randNum]; // Next card added to deck
    }
}

请注意,我没有考虑过您在此处尝试执行的操作的逻辑,我只是​​尝试解析NULL对象引用。错误是指[deck addObject: randNum]循环外的第一行。

于 2013-08-01T15:44:22.097 回答
0

尝试在您使用的地方使用这行代码NSNumber

NSNumber * randNum = [NSNumber numberWithInt: (arc4random%13)+1];

代替

[[NSNumber alloc] initWithInt: ]
于 2013-08-01T17:39:12.387 回答