9

我有一个NSString对象,

NSString *aString;

那么以下两个版本是否等效?

版本 1:

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

版本 2:

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

参考帖子

  1. nil、Nil 和 null 之间的区别

  2. 如何检测 NSString 是否为空?

  3. Apple 的 NSNull 类参考

  4. 如何在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对象是否成功初始化,即 if aStringis nil。我想知道上面两个版本的测试代码有没有区别。

4

6 回答 6

32

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

NSHipster 在这里有一个很好的讨论。他说:

NSNull 在 Foundation 和其他框架中都被使用,以绕过像 NSArray 和 NSDictionary 这样的集合不能包含 nil 值的限制。您可以将 NSNull 视为有效地将 NULL 或 nil 值装箱,以便可以在集合中使用它。

如果你有:

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

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

编辑:

在您声明您希望检查字符串是否为空(如 中@"")的注释中给出,这是不同的。看到这个问题。空字符串是一个NSString对象,它不是nil,它不是[NSNull null]

于 2013-10-30T08:45:55.660 回答
6

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

这就是您可以检查对象是否是NSNull对象的方法,但是您的第一个版本也可以。

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

if ([_object isKindOfClass:[NSNull class]]) {
   // Logic handling
}
于 2013-10-30T08:45:04.697 回答
0

nil没有任何意义。
[NSNull null]是一个对象,类的实例NSNull
==意味着相等

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

于 2013-10-30T08:42:33.533 回答
0

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

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

于 2013-10-30T08:43:44.507 回答
0

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

于 2013-10-30T08:46:04.503 回答
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 @"";

}

于 2016-01-08T06:27:31.360 回答