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)"在与您相同的数据结构中'正在存储空对象等。