方法不会返回调用时应该返回的内容

时间:2013-06-13 19:02:45

标签: ios objective-c methods return

我有一段代码返回类型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];
}

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

非常感谢!

编辑:我初始化具有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:

这是初始化游戏对象的代码,以及作为其属性的deck对象:

- (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;
}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:-1)

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

[_cards addObject: [_deck drawRandomCard]];

drawRandomCard方法中,您有以下一行:

[self.cards removeObjectAtIndex:index];

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

当您在Card *cardToAdd = [self.game.deck drawRandomCard];方法中拨打addCards:时,您可能还没有留下任何卡片。

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

希望这有帮助!