这个if语句是正确的,还是多余的?

时间:2011-08-20 14:45:26

标签: objective-c

我对Objective - C中的if语句提出了一个简单的问题。

这个if语句是否正确,或者它是多余的,我不需要指定== YES?

NSNumber *boolean = [NSNumber numberWithBool:YES];
if (boolean == YES) ...

感谢

3 个答案:

答案 0 :(得分:5)

您比较指针和整数,这不会引导您获得所需的结果。

示例:

NSNumber *boolean1 = [NSNumber numberWithBool:YES];
if (boolean1) {
    // true
}

NSNumber *boolean2 = [NSNumber numberWithBool:NO];
if (boolean2) {
    // this is also true
}

if ([boolean1 boolValue] && ![boolean2 boolValue]) {
    // true
}

答案 1 :(得分:2)

不,它不正确,它不会生成您认为的输出。 NSNumber * boolean是指向内存中对象的指针,而YES是标量值;不应将它们与==进行比较。

如果您输入此代码,您还会收到以下警告:

warning from comparison

正确的方法是:

NSNumber *boolean = [NSNumber numberWithBool:YES];
if ( [boolean boolValue] ) {
  // do something
}

但是这句话本身没有多大意义,因为你应该比较BOOL而不是NSNumber - 没有必要在那里使用NSNumber。 / p>

答案 2 :(得分:0)

这不起作用。 NSBoolean的实例是一个对象,无论是或否,都将为非NULL。

有两种方法可以检查NSBoolean的价值。

第一种是使用boolValue

NSNumber *boolean = [NSNumber numberWithBool:YES];
if ([boolean boolValue] == YES) ...
if ([boolean boolValue]) ... // simpler

第二种是使用返回对象的标识:

NSNumber *boolean = [NSNumber numberWithBool:YES];
if (boolean == (id)kCFBooleanTrue) ...

后者更快;它依赖于系统中只有NSBoolean YESNSBoolean NO中的每一个。这些值与kCFBooleanTruekCFBooleanFalse具有相同的值。我已经读到这是永远安全的,但我不确定它是Apple发布的文档的一部分。