请揭开这个空虚的神秘面纱

时间:2012-07-25 05:36:20

标签: objective-c ios

我在我的项目中调用Web服务,为了处理Web服务结果,有一个方法,它告诉服务返回什么。其他方法使用此值进行进一步处理。

网络问题,webserivce问题或任何xyz原因,webserivce处理方法返回(null)值。

现在我必须执行nul检查,两种方法适合我

if([val isEqualToString:@"(null)"]) ...

if(!val) ...

有许多关于检查null的问题,但没有清除我的概念。 有人说检查长度,如果我检查长度,如val.length它将是6,因为处理程序方法返回“(null)”。 !val我不清楚这是如何运作的。有人还说检查isKindOfClass [NSNull null] ...

任何人都可以揭开这个空虚的神秘面纱。

请不要比较nil vs Nil vs Null ...

1 个答案:

答案 0 :(得分:1)

if(!val)将测试valnull。这应该是你想要使用的,简单明了。 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] singleton。当您致电[NSNull null]时,它会返回NSNull的静态实例。如果再次调用[NSNull null],它将返回同一个对象,无论您在何处调用该方法。因为在您的应用的整个世界中只有一个NSNull实例,它的等效为null,因为在同一地址永远不会有一个对象没有&#39 ; t具有空意义。

所以,正如我上面所说的那样,它根本与你无关。如果您需要合法的Objective-C对象,但是您希望它是" null,则只需要NSNull。"使用NSNull通常比使用@"(null)"或类似的字符串更安全,因为有可能覆盖该字符串的值,搞乱字符串比较,有时候在线下您可能需要将字符串@"(null)"存储在与存储空对象等相同的数据结构中。