我有一个BOOL属性,并且在开始时此属性等于NO。我想从我的程序开始将此属性设置为YES,但有机会切换它。 为此,我做了这个吸气剂:
-(BOOL)turn
{
if(!_turn)
_turn = YES;
return _turn;
}
此getter将我的turn属性设置为YES,但它使其“常量”,始终为YES。 为什么?
我想
if(!_turn)
构造专门用于您想要设置“未设置”对象值的原因
你能回答我为什么会这样吗?如何将我的属性值设置为我想要的。谢谢。
答案 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;
}