变更记录

序号 录入时间 录入人 备注
1 2016-01-20 Alfred Jiang -

方案名称

语法 - Objective-C 中 BOOL 类成员变量的判断陷阱

关键字

语法 \ Objective-C \ BOOL \ 成员变量 \ 判断

需求场景

  1. 对某对象的 BOOL 类成员变量做肯定判断时,可能出现的判断错误

参考链接

(无)

详细内容

当自定义的类中包含 BOOL 类公共成员变量时,若该类的对象为空,

对该对象 BOOL 类成员变量做肯定判断时,无论逻辑上 BOOL 类成员变量是否为 YES,都会判断为 NO。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
TestObject *tObject0 = nil;

tObject0.isEmpty = YES;

if (tObject0.isEmpty) {
NSLog(@"tObject0 is Empty");
}
else
{
NSLog(@"tObject0 is not Empty");
}

TestObject *tObject1 = nil;

tObject1.isEmpty = NO;

if (tObject1.isEmpty) {
NSLog(@"!tObject1 is Empty");
}
else
{
NSLog(@"tObject1 is not Empty");
}

输出:
2016-01-20 12:53:04.527 TestEmpty[11315:335458] tObject0 is not Empty
2016-01-20 12:53:04.528 TestEmpty[11315:335458] tObject0 is not Empty

对该对象 BOOL 类成员变量做否定判断时,无论逻辑上 BOOL 类成员变量是否为 NO,都会判断为 YES。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
TestObject *tObject0 = nil;

tObject0.isEmpty = YES;

if (!tObject0.isEmpty) {
NSLog(@"tObject0 is Empty");
}
else
{
NSLog(@"tObject0 is not Empty");
}

TestObject *tObject1 = nil;

tObject1.isEmpty = NO;

if (!tObject1.isEmpty) {
NSLog(@"!tObject1 is Empty");
}
else
{
NSLog(@"tObject1 is not Empty");
}

输出:
2016-01-20 12:54:48.837 TestEmpty[11330:337224] tObject0 is Empty
2016-01-20 12:54:48.838 TestEmpty[11330:337224] !tObject0 is Empty

所以在针对此类成员变量判断时,一定要优先判断对象是否为空,只有在对象非空的条件下,判断 BOOL 类成员变量才有效。

效果图

(无)

备注

(无)