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)
我的简单测试结果表明上述两个版本有不同的行为:
何时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");
}
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对象初始化成功,也就是说,如果aString是nil.我想知道上述两个版本的测试代码是否有任何区别.
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].
它们不一样,NSNull是一个NSObject与nil指针相对的有效对象(继承自),它指向任何东西.
这是你如何检查一个对象是否是一个NSNull对象,但你的第一个版本也没关系.
id _object = // any kind of NSObject ...
if ([_object isKindOfClass:[NSNull class]]) {
// Logic handling
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18784 次 |
| 最近记录: |