Проверьте объект, если он равен нулю или [NSNull null] - PullRequest
0 голосов
/ 25 октября 2018

если объект имеет значение nil и я хочу проверить его значение.

if object != nil {
  // do something
}

или

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

Я предполагаю, что второе условие будет запущено, но я не уверен, почему.

Может кто-нибудь объяснить, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Как уже отмечали другие, 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, он устраняет необходимость написания нескольких условий.

0 голосов
/ 25 октября 2018

Разница между [NSNull null] и nil заключается в том, что nil - это пустой объект, который полностью исчез из памяти, и мы используем [NSNull null], когда мы хотим выразить идею, что «нам нужен контейнер, который не имеет ничего вэто, "который является" объектом, значение которого равно нулю. "Если вы посмотрите документацию по разработке, то увидите, что класс NSNull наследует NSObject и имеет только один "+ (NSNull *) null;"Классовые методы.Это означает, что объект NSNull имеет действительный адрес памяти, поэтому любая ссылка на него в программе не приведет к сбою программы.

0 голосов
/ 25 октября 2018

Если вы хотите убедиться, что object не nil и не NSNull null, тогда сделайте:

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