我尝试了以下代码:
if(myString != nil && myString.length) { ... }
然后报错:
-[NSNull length]: 无法识别的选择器发送到实例
Objective-C在第一个条件失败后不会短路吗?
我尝试了以下代码:
if(myString != nil && myString.length) { ... }
然后报错:
-[NSNull length]: 无法识别的选择器发送到实例
Objective-C在第一个条件失败后不会短路吗?
Objective-C支持短路求值,就像C语言一样。
在您的示例中,似乎myString
是NSNull
而不是nil
,因此myString != nil
为true。
NSNull是单例,用于表示仅允许对象的空值,例如在NSArray中使用的nil
。
顺便说一句,通常人们会写if (!myString && myString.length == 0)
。与nil
比较相当丑陋。另外,我会将长度与0进行比较,这似乎更清晰。
if (nil == myString)
而不是if (!myString)
,那么你是错误的。nil
被定义为0,因此这两个比较是完全相同的。 - Georg Schöllyif(myString.length) {...}
就行了,因为如果 myString 是一个 nil 对象并且你向它发送一个 length 消息,你最终也会得到 nil。 - Matt McObjective-C是C语言的一个严格超集。
由于C语言支持短路求值,因此Objective-C也支持。
||
运算符的结果只能是1
或0
,不可能是其他任何值)。 - Stephen CanonNSNull是什么?如果它是一个代表“无”的对象,那么它就不会是nil。换句话说,NSNull和nil并不相同。
如果你在某个地方使用了NSNull,那么你可能正在使用JSON解析器或CoreData。当CoreData中的数字未设置时,CoreData会返回NSNull - 可能对于CoreData中的NSString值也是如此。
同样,你可以在从服务器返回的JSON中有空元素,并且一些解析器将其作为NSNull对象提供给您。因此,在这两种情况下,您在使用值时必须小心,因为您认为是NSString或NSNumber对象的东西实际上是NSNull。
一种解决方案是在NSNull上定义一个类别,该类别简单地忽略发送到对象的所有非理解消息,如下面的代码所示。然后,您拥有的代码将起作用,因为NSNull.length将返回0。您可以在项目.pch文件中包含类似于此类的内容,该文件包含在项目中的每个文件中。
// NSNull+IgnoreMessages.h
@interface NSNull(IgnoreMessages)
- (void)forwardInvocation:(NSInvocation *)anInvocation;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
@end
//NSNull+IgnoreMessages.m
#import "NSNull+IgnoreMessages.h"
@implementation NSNull(IgnoreMessages)
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
if ( [self respondsToSelector:[anInvocation selector]] )
[anInvocation invokeWithTarget:self];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
NSMethodSignature *sig=[[NSNull class] instanceMethodSignatureForSelector:aSelector];
// Just return some meaningless signature
if(sig==nil)
sig=[NSMethodSignature signatureWithObjCTypes:"@^v^c"];
return sig;
}
@end
NSNull
而不是nil
,这样可以减少代码出错的可能性。在问题的示例中,有一个包含NSNull
的错误消息,但使用您的代码,您将看不到该错误,并且if(myString)
仍将评估为true。 - Georg SchöllyNSMethodSignature *sig=[self methodSignatureForSelector:aSelector];
呢? - user102008