构建时没有调用方法但没有错误
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)
,因为这样可以更清晰、更快速地了解正在发生的事情。
【讨论】:
以上是关于构建时没有调用方法但没有错误的主要内容,如果未能解决你的问题,请参考以下文章
Alamofire 5.0.0-rc.3 RequestInterceptor Adapt 方法没有被调用 Alamofire 虽然在响应中有任何错误时会调用重试