1

我有一个 BOOL 属性,一开始这个属性等于 NO。我想在我的程序开始时将此属性设置为 YES,但有机会切换它。为此,我做了这个吸气剂:

-(BOOL)turn
{
    if(!_turn)
        _turn = YES;
    return _turn;
}

这个 getter 将我的 turn 属性设置为 YES,但它使其“恒定”,始终为 YES。为什么?

我想

if(!_turn)

构造特别是出于您要设置“尚未设置”对象值的原因

你能回答我为什么会这样吗?以及如何将我的属性值设置为我想要的值。谢谢。

4

2 回答 2

3

看看你的行动表:

转:假真
!turn turn = YES 什么都不做

什么时候_turn是假的,你把它翻转得太真了。当_turn为真时,你什么也不做(没有 else 语句)。然后你返回 的值_turn。所以,是的,你在所有情况下都返回 true。

老实说,设计不是很好。如果要将变量的初始值设置为某个值,请在init方法中执行此操作。然后提供另一种简单地切换值的方法:

-(BOOL) toggleTurn {
  _turn = !_turn;
  return _turn;
}
于 2013-04-18T11:49:46.780 回答
2

通常惰性初始化技术与指向对象的指针一起使用,而不是与原始类型一起使用。这是因为BOOL只有两种可能的状态:NOYES,没有通常与对象的nil相关联的“未定义状态” 。

它不切换的原因是你没有切换它,你只是在它等于NO时将它设置为YES ,但是当它等于YES时你没有处理这种情况。如果您想切换它,只需执行以下操作:

-(BOOL)turn
{
    return _turn= !_turn;
}

PS:谁能争辩说您的方法不是正确的吸气剂,因为您在返回之前更改了变量。所以我建议只返回 _turn 而不切换它,并创建另一个单独的方法来切换变量。

另外我想提一下,你所做的不叫惰性初始化,我给你看一个惰性初始化的例子:

// In the interface:
@property(nonatomic,readonly) NSNumber* turnObject;
// In newer compiler versions it should be auto synthesized to _turnObject

// In the implementation: 
-(BOOL) turn
{
    // In this case I am not toggling it
    if(!_turnObject)        // Equal to if(turnObject==nil)
        _turnObject= @(NO); // Equal to _turnObject=[NSNumber numberWithBOOL: NO];
    return _turnObject;
}
于 2013-04-18T11:50:00.603 回答