我有一个NSManagedObject子类Foo,它有两个建模属性:a和b.
a和b是NSStrings,但不能保证它们会被实例化——它们也可以是nil。事实上,就像现在发生的那样,所有Foo实例都b等于nil。
我想获取所有Foo对象,例如a != b:
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Foo"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"a != b"];
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
结果数组是空的,即使我知道我有 10 个a绝对不是 nil的对象。
事实上,我什至可以通过将谓词调整为:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"a != nil"];
效果很好,并返回给我 10 个对象。
NSPredicate/的这种行为NSFetchRequest很奇怪,我不明白为什么它会为原始a != b谓词 where bis返回一个空结果null。但是当我将其更改为时工作正常a != nil(这只是硬编码的值b!!)
编写了更多测试代码来探索这个问题,似乎在比较键时,如果==属性的 LHS 或 RHS 是nil,则结果数组为空。
另一方面,如果 LHS 和 RHS 都不是nil,那么它似乎工作正常。
我在这里想念什么?为什么==操作员在比较两个键中的一个或两个时会失败nil?