构建时没有调用方法但没有错误

Posted

技术标签:

【中文标题】构建时没有调用方法但没有错误【英文标题】:method not getting called but no error when I build 【发布时间】:2014-03-25 22:49:41 【问题描述】:

我正在关注斯坦福 ios 7 课程(在第三讲中),讲师在该课程中构建了一个纸牌配对游戏。屏幕上有十二张卡片,它们与 ViewController 中的这个属性挂钩

@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;

当任何一个按钮被点击时,这个方法就会被触发

- (IBAction)touchCardButton:(UIButton *)sender 
      NSLog(@"touchCardbutton");

    int cardIndex = [self.cardButtons indexOfObject:sender];
    [self.game chooseCardAtIndex:cardIndex];
    [self updateUI];


在 viewController 中触发 updateUI

- (void)updateUI
    NSLog(@"updateUI");
    for (UIButton *cardButton in self.cardButtons)
        int index = [self.cardButtons indexOfObject:cardButton];
         NSLog(@"index in UpdateUI %d", index);
        Card *card = [self.game cardAtIndex:index];
        NSLog(@"card in UpdateUI %@", card);
        [cardButton setTitle:[self titleForCard:card ]forState:UIControlStateNormal];
        [cardButton setBackgroundImage:[self backgroundImageForCard:card]   forState:UIControlStateNormal];
        cardButton.enabled = !card.isMatched;

    

在这个 updateUi 方法中,第二个 NSLog 语句显示 card 为 nil。第一个 NSLog 语句显示 index 没有问题。那么为什么card 为零呢?我假设视图控制器中此属性所引用的 cardMatchGame 类中的 cardAtIndex 方法存在问题

来自视图控制器 @property (strong, nonatomic) CardMatchingGame *game;

cardAtIndex

-(Card *)cardAtIndex:(NSInteger)index

    NSLog(@"cardAtIndex %d", index);
    return (index < [self.cards count]) ? self.cards[index] : nil;



此 NSLog 语句未显示在控制台中,因此当我在 updateUI 中调用 cardAtIndex 时,它似乎没有发生任何事情

Card *card = [self.game cardAtIndex:index];

你能解释一下为什么我构建和运行时方法 cardAtIndex 可能没有被调用,而也没有错误消息吗?

更新

在视图控制器中,游戏属性是这样延迟实例化的

-(CardMatchingGame *)game

     if (_game) _game = [[CardMatchingGame alloc] initWithCardCount:[self.cardButtons count] usingDeck:self.createDeck];

    return _game;

【问题讨论】:

记录self.game。我猜你得到了nil,但你忘了把它分配到某个地方。 cardAtIndex 如果您请求的卡片索引高于数组中的元素数,也会返回 nil - 因此您的数组可能无法正确加载。尝试在cardAtIndex 设置断点,看看该方法发生了什么 @Wain logging self.game 说它是 NULL。在 ViewController 的顶部,我设置了这个属性 @property (strong, nonatomic) CardMatchingGame *game;,我认为它可以让我调用 self.game 而无需分配其他任何东西 @property 只是给你一个实例变量来存储一些东西,它没有将它分配给任何东西...... @Paulw11 我设置了一个断点,但它没有被触发,这并不奇怪,因为其中的 nslog 也没有记录 【参考方案1】:

您的self.game 引用是nil,所以没有调用。由于调用 nil 被定义为不执行任何操作,因此不会引发警告/错误。

您的问题似乎源于访问器方法中的逻辑问题,应该是:

- (CardMatchingGame *)game

    if (!_game)
        _game = [[CardMatchingGame alloc] initWithCardCount:[self.cardButtons count] usingDeck:self.createDeck];

    return _game;

注意添加!

通常最好不要使用快捷方式并使用if (!something),而是明确并使用if (something == nil),因为这样可以更清晰、更快速地了解正在发生的事情。

【讨论】:

以上是关于构建时没有调用方法但没有错误的主要内容,如果未能解决你的问题,请参考以下文章

调用put时出错,删除dot net core中的方法

CloudKit 方法调用挂断

没有包或对象引用,无法调用方法“import”

为啥从内部类调用特定于对象的方法/字段时没有抛出任何错误?

未调用 WKNavigationDelegate 方法

Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试