2014-07-23 30 views
0

我正在制作一款纸牌游戏,每次点击重新处理按钮时都需要重置。要做到这一点,我使用以下逻辑:使用getter进行懒惰实例化是不是很好的做法?

- (IBAction)redealClicked:(UIButton *)sender { 
self.cardGame = NULL; 
self.cardGame; //re-initialize before updating UI 
[self updateUI]; 

}

我做吸气延迟实例化,所以我想我可能会迫使它懒洋洋地实例重置我的比赛。 XCode给我一个警告,说吸气剂不应该用于副作用。从技术上讲,这正是我所做的,但懒惰的实例化是一种特殊情况?

至于为什么我在包含“self.cardGame”这一行时,而不是仅仅让它懒惰地实例化它:在程序中出现的时候,我在[self updateUI]访问的实例中翻转了一些布尔值首先访问self.cardGame。

+0

正在初始化self.cardgame也会更改一些变量,这些变量将启用/禁用[self updateUI]中的按钮。所以我必须重新初始化[自我更新UI] – user3152741

+0

这是糟糕的设计。 getter(及其延迟加载)应该只更新属性的数据。没有其他的。如果您需要更新UI,请在'updateUI'方法中执行,而不是getter方法。 – rmaddy

+0

我需要在每次重置游戏时将布尔值设置为true,因此在游戏的实例化中它是迄今为止最方便的解决方案。不管它是否仍然是糟糕的设计? – user3152741

回答

2

在getter中做延迟加载就好了。

您发布的代码无需强制延迟加载。只要这样做:

- (IBAction)redealClicked:(UIButton *)sender { 
    self.cardGame = NULL; 
    [self updateUI]; 
} 

推测updateUI方法将在某个时间点访问该属性。第一次访问会执行延迟加载。简单。

请记住,由于延迟加载,除了在cardGame getter方法中,您绝不应直接访问_cardGame ivar。

相关问题