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

Geo*_*rge 8 null objective-c nsstring nsnull

我有一个NSString对象,

NSString *aString;
Run Code Online (Sandbox Code Playgroud)

那么以下两个版本是等价的吗?

版本1:

if ( (NSString *)[NSNull null] == aString )
{
   // Logic handling
}
Run Code Online (Sandbox Code Playgroud)

版本2:

if ( nil == aString )
{
   // Logic handling
}
Run Code Online (Sandbox Code Playgroud)

参考文章

  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");
}
Run Code Online (Sandbox Code Playgroud)

控制台输出:

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
Run Code Online (Sandbox Code Playgroud)

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

现在我已经更清楚地知道NSString对象是不同的,nil并且它是一个有效的初始化实例,其中包含空字符串值@"".我真的需要在这个岗位是如何测试,如果我的NSString对象初始化成功,也就是说,如果aStringnil.我想知道上述两个版本的测试代码是否有任何区别.

jba*_*100 30

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

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

在整个Foundation和其他框架中使用NSNull来绕过NSArray和NSDictionary等集合的限制,但不能包含nil值.您可以将NSNull视为有效装箱NULL或nil值,以便可以在集合中使用它.

如果你有:

NSString *aString;
if ( aString == (NSString *)[NSNull null] )
{
   // Logic handling
}
Run Code Online (Sandbox Code Playgroud)

然后出了点问题,aString应该指向一个NSString对象(或子类),或者nil.但不是[NSNull null]哪一个是不同类的对象,你不应该从一个到另一个.

编辑:

在评论中给出了您希望检查字符串是否为空(如@"")的情况,这是不同的.看到这个问题.空字符串是一个NSString对象,它不是nil,它不是[NSNull null].


hol*_*lex 5

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

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

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

if ([_object isKindOfClass:[NSNull class]]) {
   // Logic handling
}
Run Code Online (Sandbox Code Playgroud)