获取对象时空数组和设置为 nil 的数组之间的区别?



来自 lynda.com 核心数据课程。Simon 提到,如果fetchedobjects数组为空,即存储中没有托管对象,那么代码将正常工作,并且不会记录任何错误。

但是,如果fetchedobjects数组设置为nil则会显示错误。

但是,创建数组的指针时,fetchedobjects数组不是设置为nil(if 语句前面的一行)吗?

我可能无法区分nil数组和空数组。有人可以为我解开这个问题吗?谢谢。

- (IBAction)fetchObjects:(id)sender {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Course" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
NSLog(@"Problem! %@",error);
}
for (Course *c in fetchedObjects) {
NSLog(@"Course: %@ by author: %@", c.title, c.author);
}
}

这不是一个 nil 数组这样的东西,正确的描述是它是一个指向 NSArray 指针nil空数组是一个指向没有成员的有效 NSArray 对象的 NSArray 指针。

在你正在谈论的代码中,获取的对象不是设置为 nil,而是设置为方法调用的结果。 如果方法调用失败,则返回 nil,并填充 NSError 参数,如果成功,则返回一个数组,如果未找到结果,该数组可能为空。

这个答案不响应 fetchedobjects 消息,而是指出空数组和 nil 数组(或任何 nil 对象)之间的区别

目标 C 将以 nil 响应发送到 nil 对象的任何消息。这是设计使然,允许代码像您一样检查count == 0之类的内容。

任何 nil 对象都将接受任何消息并以 nil 响应。但是没有对象的数组将正确响应它发送的其他内容。

如果数组为 nil,它将不会执行任何实际功能,并且始终响应 nil 调用的任何内容。

最佳做法是事先检查对象是否为 nil,以确定在未设置对象时要处理的其他路径。

nil 是设置为无的对象。nil 和 0 相似,但并不相同。数学上的 nil 和 0 是等价的。因此,nil 数组不会从 array.count 返回 0,而是返回 nil。但是,由于 nil 和 0 在数学上是等效的,因此结果返回 true。

我希望这能澄清一点。

如果executeFetchRequest返回nil那么你应该检查error的值。 否则,没有错误,fetchedObjects将包含包含零个或多个对象的初始化NSArray

NSError *error = nil;error设置为零,尽管这确实没有必要。

最新更新