延迟初始化objective-c后不设置属性

时间:2013-04-18 11:42:49

标签: objective-c properties boolean lazy-initialization

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

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

此getter将我的turn属性设置为YES,但它使其“常量”,始终为YES。 为什么?

我想

if(!_turn)

构造专门用于您想要设置“未设置”对象值的原因

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

2 个答案:

答案 0 :(得分:3)

查看您的行动表:

turn:     False          True
!turn   turn = YES      Do Nothing

如果_turn为假,则将其翻转为真。当_turn为真时,你什么都不做(没有别的陈述)。然后返回_turn的值。所以,你在所有情况下都会回归真实。

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

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

答案 1 :(得分:2)

通常,延迟初始化技术用于指向对象的指针,而不是基本类型。这是因为 BOOL 只有两种可能的状态: NO YES ,没有“未定义状态”,它通常与< em> nil 用于对象。

它不切换的原因是你没有切换它,你只是将它设置为 YES 当它等于 NO ,但你不是处理等于 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;
}