Objective C NSPredicate predicateWithBlock删除nil / null值

时间:2013-04-15 18:10:12

标签: objective-c null nsnull

我试图通过获取现有数组并从中删除nil值来填充数组。该数组是从http调用的JSON响应中填充的。有时数组最后有一个空值,并且最简单的方法是删除该值,这样我就不必在代码中的任何地方处理它,而是使用NSArray的{​​{1}}分配将变量放入我在整个班级中使用的实例变量中。

filteredArrayUsingPredicate:

在上面的代码中,返回值始终为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

enter image description here

这不是evaluatedObject = id 0x00000000 / null值吗?与nil相比,此值有何不同?

2 个答案:

答案 0 :(得分:2)

NSArray 不可能包含nil元素。

一些枚举方法确实在枚举之后将发送给你,作为你已经到达终点的信号,但是nil不是 in 数组 - 它只是一个信号,你不应该做任何严肃的事情。但是,我不知道这是否是其中之一。

我建议不要尝试从数组中删除nil,这是不可能的,因为nil从来就不存在,所以你直接检查数组(记录它,查看调试器,无论如何)并确保自己是什么你想做的事情是不必要的。

答案 1 :(得分:2)

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

BOOL ret = (evaluatedObject != nil && [evaluatedObject isKindOfClass:[NSNull class]] == NO);