使用getter进行懒惰实例化是一种好习惯吗?

时间:2014-07-23 22:24:28

标签: objective-c

我正在制作一个需要在每次点击重新交易按钮时重置的纸牌游戏。为此,我使用以下逻辑:

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

}

我在getter中做了懒惰的实例化,所以我想我可以强迫它懒惰地实例化以重置我的游戏。 XCode正在给我一个警告,说吸气剂不应该用于副作用。从技术上讲,这正是我正在做的事情,但懒惰的实例化是一个特例吗?

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

1 个答案:

答案 0 :(得分:2)

在getter中进行延迟加载就可以了。

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

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

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

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