检查对象是否等于nil或[NSNull null]

时间:2018-10-24 22:33:09

标签: objective-c null

如果对象设置为nil,我想检查其值。

if object != nil {
  // do something
}

if object != [NSNull null] {
  // do something
}

我想第二个条件将被触发,但是我不确定为什么。

有人可以解释吗?

3 个答案:

答案 0 :(得分:1)

如果要确保object不是nil也不是NSNull null,请执行以下操作:

if (object && object != [NSNull null]) {
    // do something with object
} // else it's either nil or NSNull null

答案 1 :(得分:1)

正如其他人指出的那样,object != nil && object != NSNull.null会给您预期的行为,但是每次写这对条件可能很繁琐且容易出错。

或者,您可以通过向系统中几乎所有对象添加nonNullValue方法来使用反逻辑:

// in some header file
@interface NSObject(NullExtension)
- (instancetype)nonNullValue;
@end

// in some implementation file    
@implementation NSObject(NullExtension)

// regular objects are not null (right?)
- (instancetype)nonNullValue {
    return self;
}
@end

@implementation NSNull(NullExtension)

// let's make NSNull report as being null
- (instancetype)nonNullValue {
    return nil;
}
@end

// adding this just for the sake of completeness, it's highly unlikely
// that JSON's will decode NSProxy instances
@implementation NSProxy(NullExtension)

- (instancetype)nonNullValue {
    return self;
}
@end

然后您可以简单地在指针上使用它:

// since we're in Objective-C, a nil pointer will always fail the check
// and thanks to the NSNull extension, NSNull instances will behave the same
if ([object nonNullValue] != nil) {
    // NSNull won't get here
    // nils won't get here
    // other objects will get here
}

此方法涉及所有NSObject子类,因此具有一定的侵入性,但是无需编写多个条件。

答案 2 :(得分:1)

[NSNull null]和nil之间的区别是nil是一个完全从内存中消失的空对象,当我们要表达“我们需要一个没有任何东西的容器”的想法时,我们使用[NSNull null]。它”,即“值为空的对象”。如果查看开发文档,您会看到NSNull类继承了NSObject,并且只有一个“ +(NSNull *)null;”。类方法。这意味着NSNull对象具有有效的内存地址,因此程序中对其的任何引用都不会导致程序崩溃。