1

我正在尝试通过获取现有数组并从中删除 nil 值来填充数组。该数组是从 http 调用的 JSON 响应中填充的。有时数组最后有一个空值,删除该值的最简单方法是,我不必在代码中的任何地方处理它,就是使用NSArray'sfilteredArrayUsingPredicate:将变量分配给我在整个过程中使用的实例变量班级。

NSArray *respAgencyList = (NSArray*) [JSON valueForKeyPath:@"xml.path.to.data" ];
NSLog(@"data before filter: %@", respAgencyList); 
// prints: ( { domain: "foo.com", name:"foobar"}, "<null>" });
if (respAgencyList != nil && respAgencyList.count > 0) {
    agencies = [respAgencyList filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
            NSLog(@"Evaluated object is %@", evaluatedObject); //prints <null> for the null value
            BOOL ret = evaluatedObject != nil;
            return ret;

        }]];
}

在上面的代码中,返回值总是YES. 但是,当我打开调试器并单步执行时,我看到:

evaluatedObject = id 0x00000000

在此处输入图像描述

这不是一个null/nil值吗?与 相比,这个值有什么不同nil

4

2 回答 2

2

NSArray 不可能包含元素nil

一些枚举方法确实在枚举之后将 nil 作为您已到达末尾的信号,但 nil 不在数组中- 它只是一个信号,您不应该对它做任何严重的事情。但是,我不知道这是否是其中之一。

我建议不要尝试从数组中删除 nil,这是不可能的,因为 nil 从一开始就不存在,而是直接检查数组(记录它,查看调试器等)并确保自己是什么尝试做是不必要的。

于 2013-04-15T18:15:19.827 回答
2

您还应该检查NSNull,因为它是一个正确的对象 ,所以它可以放入a 中。NSArray

BOOL ret = (evaluatedObject != nil && [evaluatedObject isKindOfClass:[NSNull class]] == NO);
于 2013-04-15T18:28:05.867 回答