1

如果对象设置为 nil 并且我想检查它的值。

if object != nil {
  // do something
}

或者

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

我猜第二个条件会被触发,但我不知道为什么。

有人可以解释一下吗?

4

3 回答 3

1

如果你想确定object不是nil和它不是NSNull null那么做:

if (object && object != [NSNull null]) {
    // do something with object
} // else it's either nil or NSNull null
于 2018-10-25T05:19:40.977 回答
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子类,但是它消除了编写多个条件的需要。

于 2018-10-25T06:10:36.763 回答
1

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

于 2018-10-25T07:22:07.403 回答