if(!val)
将测试是否val
是null
。那应该是您想要使用的,简单明了。if(val == nil)
是等价的。
[val isEqualToString:@"null"]
顾名思义,将测试是否val
等于字符串“null”,这肯定会使其不是null
。
[val isKindOfClass:[NSNull class]]
现在与你无关,所以不要担心。
编辑,因为您要求解释NSNull
:
有时,您需要能够存储概念而nil
不是nil
自身。
nil
假设你想要一个里面有一个数组。你希望你的数组看起来像[obj1, obj2, nil, obj3]
.
你不能像这样声明一个数组,[NSArray arrayWithObjects:obj1, obj2, nil, obj3, nil]
因为当它通过参数时,当它看到nil
它就会停止。这将导致数组[obj1, obj2]
,这不是您想要的。
那么在这种情况下你会怎么做呢?你做你的数组[NSArray arrayWithObjects:obj1, obj2, [NSNull null], obj3]
。现在您的数组中有一个对象,但这个特定的对象是系统中每个人都同意称之为“null”的对象。它实际上不是空的。
这里真正发生的[NSNull null]
是一个单例。当您调用 时[NSNull null]
,它会返回 的静态实例NSNull
。如果您[NSNull null]
再次调用,它将返回相同的对象,无论您在哪里调用该方法。因为NSNull
在您的应用程序的整个世界中只有一个实例,所以它等同于 null,因为在同一个地址上永远不会有一个对象不具有 null 的含义。
所以,正如我上面所说,它与你根本无关。仅NSNull
当您需要合法的 Objective-C 对象但您希望它为“null”时才需要。它通常NSNull
比简单地使用字符串@"(null)"
或类似的东西更安全,因为它可能会覆盖该字符串的值,弄乱字符串比较,有时您可能需要将字符串存储@"(null)"
在与您相同的数据结构中'正在存储空对象等。