我有一段代码返回类型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;
}
答案 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循环并让我知道,
希望这有帮助!