来自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);
}
}
答案 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,尽管这确实没必要。