我有一个NSString
对象,
NSString *aString;
那么以下两个版本是否相同?
版本1:
if ( (NSString *)[NSNull null] == aString )
{
// Logic handling
}
版本2:
if ( nil == aString )
{
// Logic handling
}
我的简单测试结果显示上述两个版本有不同的行为:
初始化aString
后再分配nil
:
false
表达版本1,
true
用于版本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
。我想知道上述两个版本的测试代码是否有任何区别。
答案 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 else
与something is equal to nothing
答案 3 :(得分:0)
[NSNull null]
返回NSNull
的单例实例。
aString == [NSNull null]
比较了两个指针。只要aString
没有指向NSNull
单身,它们将永远不会相等。
答案 4 :(得分:0)
如果要将字符串匹配为nil:
1. if(String.length == 0)
{
}
答案 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 @"";
}