【问题标题】:NSError is nil after out of scope超出范围后 NSError 为零
【发布时间】:2014-03-09 20:02:55
【问题描述】:

我的班级有成员__strong NSError *authError; 我想以一种方法捕获并创建它并签入另一种方法。 所以如果方法一出现错误:

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 类成员。但是在执行最后一个 breket authError 之后变为 nil。 在方法2中:

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

条件返回YES

一些附加信息:方法 2 是 shouldPerformSegueWithIdentifier 有人可以给我一个提示吗?

【问题讨论】:

  • 如果这是一个实例变量,你说self.authError会更可靠更清楚。
  • 好的,所以 - 放置日志记录或断点,然后查看设置 authError 实例变量的行是否实际运行过。例如,如果不满足if 条件,则花括号中的条件代码不会运行...
  • 另外,不需要显式写 __strong ,它已经有强“标记”了。
  • 另一件事要尝试;在这两种方法中使用日志来查看它们被调用的顺序。如果它们在方法 2 和方法 1 中被调用,显然方法 1 还没有机会设置您的实例变量,即使设置它的代码正在运行。
  • @matt 是对的。 shouldPerformSegueWithIdentifier 在方法 1 之前被调用

标签: ios error-handling null nserror


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多