0

我有一段代码返回如下类型的对象Card

-(Card*) drawRandomCard {
    if ([self.cards count]) {
        unsigned index = arc4random() % self.cards.count;
        Card *randomCard = self.cards[index];
        [self.cards removeObjectAtIndex:index];
        NSLog(@"%@", randomCard.description);   **//returns a description and not null**
        return randomCard;
    } else {
        NSLog(@"nil");
        return nil;
    }
}

当我在其他功能中使用它时,这实际上工作正常,但是下面这个有问题:

- (IBAction)addCards:(UIButton *)sender {
    int numberOfCardsToAdd = EXTRA_CARDS_NUMBER;

    if ([[self.collectionView visibleCells] count] == 0) {
        numberOfCardsToAdd = self.startingCardCount;
    }

    for (int i = 0; i < numberOfCardsToAdd; i++) {
        if (!self.game.deck.isEmpty){
            Card *cardToAdd = [self.game.deck drawRandomCard];   
            NSLog(@"%@", cardToAdd.description); **// gives (null)**
                if (cardToAdd) {  **// this does not get called**
                    // do stuff with cardToAdd
               }
            }
        }
        [self.collectionView reloadData];
}

因此,由于某种原因,当使用上述方法调用时,似乎 mydrawRandomCard不起作用。有谁知道如何解决这一问题?

非常感谢!

deck编辑:我用于初始化具有属性的游戏对象的方法:

- (id) initWithNumberOfCards: (int) numberOfCards withDeck: (SetsPlayingDeck *) deck {
    self = [self init];
    self.score = 0;
    _deck = deck;
    _cards = [[NSMutableArray alloc] initWithCapacity:numberOfCards];
    for (int i = 0; i < numberOfCards; i++) {
        [_cards addObject: [_deck drawRandomCard]];
    }
    return self;

}

这个方法在程序开始时被调用。

编辑#2:

下面是初始化游戏对象的代码,以及作为其属性的甲板对象:

- (SetsGame *) game {
    if (!_game) {
        SetsPlayingDeck *deck = [[SetsPlayingDeck alloc] init];
        _game = [[SetsGame alloc] initWithCardCount:self.startingCardCount usingDeck:deck];
    }

    NSLog(@"%@", _game.deck.description);  **// this returns null!!**
    return _game;
}
4

2 回答 2

1

据我所知,问题应该出在方法initWithCardCount:usingDeck:上,您可能忘记将deck参数分配给deck属性(或者由于某种原因未执行分配):

    _game = [[SetsGame alloc] initWithCardCount:self.startingCardCount usingDeck:deck];

因此,请查看此或发布该方法定义。

于 2013-06-16T07:54:44.837 回答
-1

也许问题是你的卡用完了。在您的 init 方法中,您在 for 循环中有以下行:

[_cards addObject: [_deck drawRandomCard]];

在您的drawRandomCard方法中,您有以下行:

[self.cards removeObjectAtIndex:index];

我假设_cards(第一行)和self.cards(第二行)是不同的对象。

可能,当您Card *cardToAdd = [self.game.deck drawRandomCard];addCards:方法中调用时,您已经没有任何卡片了。

尝试设置断点并进入 for 循环并让我知道,

希望这可以帮助!

于 2013-06-13T20:56:04.833 回答