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

时间:2014-01-08 04:03:00

标签: objective-c core-data nsarray fetch null

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

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

但是当创建数组的指针(if语句之前的一行)时,fetchedobjects数组是否设置为nil

我可能无法区分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);
}

}

3 个答案:

答案 0 :(得分:4)

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

在您所讨论的代码中,获取的对象未设置为nil,它被设置为方法调用的结果。如果方法调用失败,则返回nil,并填充NSError参数,如果成功则返回一个数组,如果没有找到结果,该数组可能为空。

答案 1 :(得分:2)

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

目标C将对发送给nil对象的任何消息作出nil响应。这是设计允许代码检查像count == 0这样的事情,就像你正在做的那样。

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

如果数组是nil,它将不会执行任何实际的函数,并且总是对所调用的任何内容作出响应。

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

nil是一个设置为空的对象。零和0相似但不相同。数学上为零和0是等价的。因此,nil数组不会从array.count返回0,而是返回nil。但是因为nil和0在数学上是等价的,所以结果返回true。

我希望稍微澄清一下。

答案 2 :(得分:0)

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

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