nil和(NSString *)[NSNull null]等效于检查空的NSString对象

时间:2013-10-30 08:39:11

标签: objective-c nsstring null nsnull

我有一个NSString对象,

NSString *aString;

那么以下两个版本是否相同?

版本1:

if ( (NSString *)[NSNull null] == aString )
{
   // Logic handling
}

版本2:

if ( nil == aString )
{
   // Logic handling
}

参考文献

  1. Difference among nil, Nil, and null

  2. How to detect if NSString is null?

  3. Apple's NSNull Class Reference

  4. How do I test if a string is empty in Objective C?

  5. 更新 - 测试结果

    我的简单测试结果显示上述两个版本有不同的行为:

    1. 初始化aString后再分配nil

      false表达版本1,

      true用于版本2中的表达。

    2. 使用aString的值初始化@""

      false表达版本1,

      false用于版本2中的表达。

    3. 所以很明显,这两个版本的行为并不相同。

      测试代码:

      NSString *aString = nil;
      NSString *bString = [NSString stringWithFormat:@""];
      
      if ((NSString *)[NSNull null] == aString) {
          NSLog(@"a1 - true");
      } else {
          NSLog(@"a1 - false");
      }
      
      if (nil == aString) {
          NSLog(@"a2 - true");
      } else {
          NSLog(@"a2 - false");
      }
      
      if ((NSString *)[NSNull null] == bString) {
          NSLog(@"b1 - true");
      } else {
          NSLog(@"b1 - false");
      }
      
      if (nil == bString) {
          NSLog(@"b2 - true");
      } else {
          NSLog(@"b2 - false");
      }
      

      控制台输出:

      2013-10-31 00:56:48.132 emptyproject[31104:70b] a1 - false
      2013-10-31 00:56:48.133 emptyproject[31104:70b] a2 - true
      2013-10-31 00:56:48.133 emptyproject[31104:70b] b1 - false
      2013-10-31 00:56:48.133 emptyproject[31104:70b] b2 - false
      

      更新 - 我的意思是“空字符串”**

      现在我已经更清楚地知道NSString对象与nil不同,并且它是一个有效的初始化实例,其中包含空字符串值@""。我在这篇文章中真正需要的是如何测试我的NSString对象是否已成功初始化,即aString是否为nil。我想知道上述两个版本的测试代码是否有任何区别。

6 个答案:

答案 0 :(得分:30)

[NSNull null]nil不相同。 [NSNull null]意味着在nil无法使用的情况下表示NULL的概念(如无对象中),例如在NSArray中(因为您只能在其中插入对象) 。 [NSNull null]是一个对象(始终是同一个对象),而nil是指向0的指针。

NSHipster有一个很好的讨论here。他说:

  

NSNull在整个基础和其他框架中使用   围绕像NSArray和NSDictionary这样的集合的限制   无法包含零值。您可以将NSNull视为   有效地装箱NULL或nil值,以便可以使用它   集合。

如果你有:

NSString *aString;
if ( aString == (NSString *)[NSNull null] )
{
   // Logic handling
}

然后出现问题,aString应指向NSString对象(或子类)或nil。但是[NSNull null]不是一个不同类的对象,你不应该从一个类转换到另一个类。

修改

在评论中,您声明要检查字符串是否为空(如@""),这是不同的。见question。空字符串是NSString对象,它不是nil,而不是[NSNull null]

答案 1 :(得分:5)

它们不一样,NSNull是一个有效的对象(继承自NSObject),与nil指针相对,它指向任何东西。

这是你如何检查对象是否是NSNull对象,但你的第一个版本也没关系。

id _object = // any kind of NSObject ...

if ([_object isKindOfClass:[NSNull class]]) {
   // Logic handling
}

答案 2 :(得分:0)

nil没有任何意义 [NSNull null]是一个对象,类NSNull的实例 ==表示平等

something equals to something elsesomething is equal to nothing

不同

答案 3 :(得分:0)

[NSNull null]返回NSNull的单例实例。

aString == [NSNull null]比较了两个指针。只要aString没有指向NSNull单身,它们将永远不会相等。

答案 4 :(得分:0)

如果要将字符串匹配为nil:
1. if(String.length == 0) { } 3.如果(ASTRING!=无) { 其他 { //在这里做你的东西 }

答案 5 :(得分:0)

+(NSString*)replaceNullValuesWithEmptyString:(id)tempObj
{
if (([tempObj isKindOfClass:[NSNull class]])||
    (tempObj == nil) ||
    (tempObj == (id)[NSNull null])||
    [tempObj isEqual:[NSNull null]] ||
    [tempObj isEqual:nil]) {
}
else {
    if([tempObj respondsToSelector:@selector(isEqualToString:)]) {
        if ([tempObj isEqualToString:@"<null>"] ||
            [tempObj isEqualToString:@"(null)"]) {
        }
        else {
            if ([tempObj respondsToSelector:@selector(length)]) {
                if ([tempObj length]>0) {
                     NSLog(@"Check Passed.");
                    return tempObj;
                }
            }
        }
    }
}
NSLog(@"Check failed.");
return @"";

}