1

在下面的代码中,当返回 NSError 时,会在 XCode 中显示类类型为“HomeViewController”——我的视图控制器之一。如果我用双指针做了一些不寻常的事情,这将是有道理的,但我没有。为什么会这样?我的代码中是否有一些愚蠢的错误,Core Data 中的错误,或者 ????

希望我不是在自欺欺人!

self->ctx = [(AppDelegate *) [[UIApplication sharedApplication] delegate] managedObjectContext];
NSFetchRequest * request = [[NSFetchRequest alloc] init];

NSEntityDescription *entityDescription = [NSEntityDescription
                                          entityForName:@"Street" inManagedObjectContext:self->ctx];

NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:@"street" ascending:YES];
NSArray* sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];


[request setEntity:entityDescription];
[request setSortDescriptors:sortDescriptors];

NSError * error;
NSArray *array = [self->ctx executeFetchRequest:request error:&error];
if(error!=nil){
    NSLog(@"%@", @"Critical model error search");
}
_streets = array;
4

2 回答 2

5

显然,您正在使用的方法 ( [self->ctx executeFetchRequest:request error:&error]) 不会将其参数设置为nil如果没有错误,只是在发生错误时设置为错误。将您的变量初始化为nil: NSError *error = nil;

正如评论中所指出的,您必须检查调用的返回值,并且只有当它是nilNO(取决于声明的返回类型)是NSError保证有效的指针(包括 nil)时,即使它是有效的。所以代替if(error != nil), 使用if(!array)or if(array == nil)

于 2013-04-26T20:23:44.903 回答
0

这不断出现。所以,一些具体的例子。

没有理由将 NSError 初始化为 nil。需要注意的是,如果你用 &err 调用的对象是 nil,你会得到一个错误的失败,并且检查一个未初始化的错误会爆炸。 但是,这种失败模式与导致失败的尝试非常不同,实际上,您应该避免接收 nil 的情况(想象一下,如果您的托管对象上下文意外地为 nil——您可能遇到的问题比错误错误大得多) .

这是返回 BOOL 并接受 NSError** 的方法的完全有效实现。有效,但显然是人为的。但是,这种事情确实发生在多层 API 中。

 - (BOOL)doThis:(NSError**)chaffin
 {
    if (chaffin) *chaffin = 0x42;
    return YES;
 }

计算误差可能很昂贵。如果您只需要知道成功/失败而不是为什么,则为错误参数传递 null。

于 2016-03-06T02:15:31.853 回答