在下面的代码中,返回时,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;
答案 0 :(得分:5)
显然,如果没有错误,您正在使用的方法([self->ctx executeFetchRequest:request error:&error]
)不会将其参数设置为nil
,如果出现错误,则不会将其设置为错误。 将变量初始化为 nil
:NSError *error = nil;
。
正如评论中所指出的,你必须检查调用的返回值,并且只有当它是nil
或NO
(取决于声明的返回类型)时才是{{1} }指针保证有效(包括nil),即使它有效进入。所以使用NSError
或if(error != nil)
代替if(!array)
。
答案 1 :(得分:0)
这种情况不断发生。所以,一些具体的例子。
没有理由将NSError初始化为nil。一个警告是,如果您使用& err调用的对象为nil,则会出现错误的故障并检查未初始化的错误是否会爆炸。 然而,失败模式与导致失败的尝试非常不同,实际上,您应该避免使用nil收件人案例(想象一下如果您的托管对象上下文意外地为零 - 您可能有很多比错误错误更大的问题。)
这是一个返回BOOL并采用NSError **的方法的完全有效的实现。有效,但显然是做作的。但是,这种事情确实发生在许多分层API中。
- (BOOL)doThis:(NSError**)chaffin
{
if (chaffin) *chaffin = 0x42;
return YES;
}
计算错误可能很昂贵。如果您只需要知道成功/失败,则为null参数传递null,但不是为什么。