【问题标题】:Is nil and (NSString *)[NSNull null] equivalent in checking empty NSString objectnil 和 (NSString *)[NSNull null] 在检查空 NSString 对象时是否等效
【发布时间】:2013-11-09 17:47:55
【问题描述】:

我有一个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?

更新 - 测试结果

我的简单测试结果表明以上两个版本的行为不同:

  1. aString被初始化然后分配nil时:

    false 用于版本 1 中的表达式,

    true 用于版本 2 中的表达式。

  2. aString被初始化为@""时。

    false 用于版本 1 中的表达式,

    false 用于版本 2 中的表达式。

因此很明显,这两个版本的行为并不相同。

测试代码:

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。我想知道上面两个版本的测试代码有什么区别。

【问题讨论】:

  • 它们怎么可能相等?
  • 致@Sulthan,所以我不能用if ( aString == nil ) 替换if ( aString == (NSString *)[NSNull null] )
  • 没有。你想做什么?
  • 它是等价的,但是你需要更少的代码:)
  • @congliu 你应该巧妙地解析字典。使用NSDictionary 上的类别自动将NSNull 转换为nil

标签: objective-c nsstring null nsnull


【解决方案1】:

nil 表示什么都没有。
[NSNull null] 是一个对象,NSNull 类的实例
== 表示相等

something equals to something elsesomething is equal to nothing不一样

【讨论】:

    【解决方案2】:

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

    aString == [NSNull null] 比较两个指针。只要aString 不指向NSNull 单例,它们就永远不会相等。

    【讨论】:

      【解决方案3】:

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

      你可以这样检查一个对象是否是NSNull对象,但你的第一个版本也可以。

      id _object = // any kind of NSObject ...
      
      if ([_object isKindOfClass:[NSNull class]]) {
         // Logic handling
      }
      

      【讨论】:

      • 支票== [NSNull null] 也完全有效。
      【解决方案4】:

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

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

      NSNull 用于 Foundation 和其他框架 围绕 NSArray 和 NSDictionary 等集合的限制 不能包含 nil 值。您可以将 NSNull 视为 有效地装箱 NULL 或 nil 值,以便它可以用于 收藏。

      如果你有:

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

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

      编辑:

      鉴于您在 cmets 中声明您希望检查字符串是否为空(如在@"" 中),这是不同的。请参阅此question。空字符串是NSString 对象,它不是nil,也不是[NSNull null]

      【讨论】:

      • 致@jbat100,现在我已经更清楚地表明NSString 对象是nil 和它拥有@"" 是不同的。所以我在帖子中真正需要的是如何测试我的NSString对象是否初始化成功,即aString是否为nil
      • if (aString == nil) {//字符串未初始化}
      • if (aString != nil) {//字符串已初始化}
      • “那么有问题” “有问题”可能是懒惰。有时人们会在变量中放入一个不确定类的对象,然后再检查它,以免引入另一个变量。
      • 也许string.length > 0 ?
      【解决方案5】:

      如果你想匹配一个字符串为 nil:
      1. if(aString.length==0) { }
      2.if(sString isEqualToString:@"") { }
      3.if(aString!=nil) { } 别的 { //在这里做你的事情 }

      【讨论】:

        【解决方案6】:
        +(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 @"";
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-08
          • 2011-06-26
          相关资源
          最近更新 更多