超出范围后NSError为零

时间:2014-03-09 20:02:55

标签: ios error-handling null nserror

我的班级有__strong NSError *authError;成员 我想用一种方法捕捉并创建它并检查另一种方法。 因此,如果方法1中发生错误:

if([returnString rangeOfString:@"dd"].location != NSNotFound) {  
        NSMutableDictionary *errorDetail = [NSMutableDictionary dictionary];
        [errorDetail setValue:@"Wrong user crediantials" forKey:NSLocalizedDescriptionKey];
        authError = [NSError errorWithDomain:@"mydomain" code:101 userInfo:errorDetail];

        return nil;
    }

我将它直接分配给authError类成员。但是在最后一次执行后,authError变为零。 在方法2中:

if(authError != nil){
        return NO;
    }

条件返回YES

其他一些信息:方法2是shouldPerformSegueWithIdentifier 有人能给我一个暗示吗?

1 个答案:

答案 0 :(得分:0)

这里的问题与“之后”一词的定义有关。您正在方法1中设置实例变量并在方法2中获取它。但是这不会告诉您有关操作的真实顺序的信息。如果在方法1有机会运行之前调用方法2,则方法2将发现您的实例变量为nil(因为这是它的自动初始化值)。

我的书有riff on this very topic(按“入口点”我的意思是运行时调用的方法):

  

增加您的挑战是您无法确切知道何时会调用入口点。文档可能会给您一般意义,但在大多数情况下,它并不能保证事件何时到达以及按什么顺序排列。你认为会发生什么,甚至文档引导你相信会发生什么,可能不是真正发生的事情。您自己的代码可能会触发意外事件。文档可能无法在发送通知时明确说明。在Cocoa中甚至可能存在一个错误,即事件的调用方式似乎与文档相矛盾。并且您无法访问Cocoa源代码,因此无法确定基础细节。因此,我还建议您在开发应用程序时,通过穴居人调试(NSLog;请参阅第9章)对您的代码进行大量检测。在测试代​​码时,请密切关注控制台输出并检查消息是否有意义。您可能会对发现的内容感到惊讶。