2013-04-18 64 views
1

我有一个BOOL属性,并且在开始时该属性等于NO。我想从我的程序开始将此属性设置为YES,但有机会切换它。 对于这一点,我做了这个消气:属性在懒惰初始化后没有设置objective-c

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

此getter设置轮到我属性为YES,但它使得“不变”,永远是。 为什么?

我想

if(!_turn) 

建设是专门为你想要设置的原因,“没有被设定”目标值

你能回答我为什么会是这样?我怎样才能将我的财产价值设定为我想要的。谢谢。

+0

问题不明确...... –

+0

@BhanuPrakash在此之后吸气剂,我不能把我的回合属性设置为NO。例如:'self.turn =!self.turn;'由于getter,结果将是YES,我想但是为什么? –

回答

3

看看你的动作表:

 
turn:  False   True 
!turn turn = YES  Do Nothing 

_turn是假的,你翻转它太真实。当_turn为真时,你什么也不做(没有别的声明)。然后你返回_turn的值。所以,你在所有情况下都会回归真实。

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

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

用init方法的想法很帮我,谢谢!:) –

2

一般的延迟初始化技术用于与对象的指针,不与原始类型。这是因为一个BOOL只有两个不可能性的状态:NOYES,没有了“不确定状态”,它通常与的对象相关联。

为什么它不切换的原因是,你是不是翻转它,你只是将它设置为YES 这等于NO,但你是不是办案时,它等于。如果你想切换它只是做到这一点:

-(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; 
} 
+0

谢谢你的回答,它也帮助我。 –

相关问题