如何检查NSArray中的对象是否为NSNull?

时间:2013-09-27 20:06:24

标签: ios objective-c nsarray nsnull

我得到一个空值的数组。请检查下面我的阵列的结构:

 (
    "< null>"
 )

当我尝试访问索引0时因为

而崩溃
-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x389cea70

目前因为该数组带有崩溃日志而崩溃:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x389cea70'
*** First throw call stack:
(0x2d9fdf53 0x3820a6af 0x2da018e7 0x2da001d3 0x2d94f598 0x1dee57 0x1dfd31 0x302f598d 0x301a03e3 0x3052aeed 0x3016728b 0x301659d3 0x3019ec41 0x3019e5e7 0x30173a25 0x30172221 0x2d9c918b 0x2d9c865b 0x2d9c6e4f 0x2d931ce7 0x2d931acb 0x3262c283 0x301d3a41 0xabb71 0xabaf8)
libc++abi.dylib: terminating with uncaught exception of type NSException

9 个答案:

答案 0 :(得分:117)

id object = myArray[0];// similar to [myArray objectAtIndex:0]

if(![object isEqual:[NSNull null]])
{
    //do something if object is not equals to [NSNull null]
}

答案 1 :(得分:29)

if (myArray != (id)[NSNull null])

OR

if(![myArray isKindOfClass:[NSNull class]]) 

答案 2 :(得分:13)

根据托尼的回答,我做了一个宏。

#define isNSNull(value) [value isKindOfClass:[NSNull class]]

然后使用它

if (isNSNull(dict[@"key"])) ...

答案 3 :(得分:7)

Awww,伙计们。这很简单。

// if no null values have been returned.
if ([myValue class] == [NSNull class]) {
    myValue = nil;
}

我确定有更好的答案,但这个有效。

答案 4 :(得分:6)

我发现使用NSNull的代码存在以下问题:

  • 看起来很吵和丑陋。
  • 耗时。
  • 容易出错。

所以我创建了以下类别:

@interface NSObject (NSNullUnwrapping)

/**
* Unwraps NSNull to nil, if the object is NSNull, otherwise returns the object.
*/
- (id)zz_valueOrNil;

@end

实施:

@implementation NSObject (NSNullUnwrapping)

- (id)zz_valueOrNil
{
    return self;
}

@end

@implementation NSNull (NSNullUnwrapping)

- (id)zz_valueOrNil
{
    return nil;
}

@end

符合以下规则:

  • 如果为同一Class(即Class类型的单例实例)声明了两次类别,则行为未定义。但是,允许在子类中声明的方法覆盖其超类中的类别方法。

这允许更简洁的代码:

[site setValue:[resultSet[@"main_contact"] zz_valueOrNil] forKey:@"mainContact"];

。 。而不是有额外的行来检查NSNullzz_前缀看起来有点难看但是为了安全起见以避免命名空间冲突。

答案 5 :(得分:3)

已经给出了很多好的和有趣的答案,并且(nealry)所有这些答案都有效。

只是为了完成(以及它的乐趣):

记录

[NSNull null]返回单例。因此

Right click table and View Dependancy

也很好。

然而,由于这是一个例外,我不认为使用==来比较对象通常是一个好主意。 (如果我要检查您的代码,我当然会对此发表评论。)

答案 6 :(得分:2)

在Swift中(或者从Objective-C桥接),可以在一个选项数组中包含NSNullnilNSArray只能包含对象,永远不会有nil,但可能包含NSNull。但是,Any?类型的Swift数组可能包含nil

let myArray: [Any?] = [nil, NSNull()] // [nil, {{NSObject}}], or [nil, <null>]

要检查NSNull,请使用is检查对象的类型。对于Swift数组和NSArray对象,此过程是相同的:

for obj in myArray {
    if obj is NSNull {
        // object is of type NSNull
    } else {
        // object is not of type NSNull
    }
}

您还可以使用if letguard来检查您的对象是否可以投放到NSNull

guard let _ = obj as? NSNull else {
    // obj is not NSNull
    continue;
}

if let _ = obj as? NSNull {
    // obj is NSNull
}

答案 7 :(得分:2)

考虑这种方法:

选项1:

NSString *str = array[0];

if ( str != (id)[NSNull null] && str.length > 0 {
    // you have a valid string.
} 

选项2:

NSString *str = array[0];
str = str == (id)[NSNull null]? nil : str;

if (str.length > 0) {
   // you have a valid string.
} 

答案 8 :(得分:1)

您可以使用以下检查:

if (myArray[0] != [NSNull null]) {
    // Do your thing here
}

原因可以在Apple的官方文档中找到:

使用NSNull

NSNull类定义了一个单例对象,用于在禁止nil作为值的情况下表示空值(通常在集合对象(如数组或字典)中)。

NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = @[nullValue];
NSLog(@"arrayWithNull: %@", arrayWithNull);
// Output: "arrayWithNull: (<null>)"

重要的是要理解NSNull实例在语义上与NO或false不同 - 这两者都代表逻辑值; NSNull实例表示缺少值。 NSNull实例在语义上等同于nil,但是理解它不等于nil也很重要。因此,要测试空对象值,必须进行直接对象比较。

id aValue = [arrayWithNull objectAtIndex:0];
if (aValue == nil) {
    NSLog(@"equals nil");
}
else if (aValue == [NSNull null]) {
    NSLog(@"equals NSNull instance");
    if ([aValue isEqual:nil]) {
        NSLog(@"isEqual:nil");
    }
}
// Output: "equals NSNull instance"

取自https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html