NSError *返回的地址不好 - 为什么?

时间:2013-04-26 20:20:32

标签: objective-c xcode

在下面的代码中,返回时,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;

2 个答案:

答案 0 :(得分:5)

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

正如评论中所指出的,你必须检查调用的返回值,并且只有当它是nilNO(取决于声明的返回类型)时才是{{1} }指针保证有效(包括nil),即使它有效进入。所以使用NSErrorif(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,但不是为什么。