【问题标题】:NSError EXC_BAD_ACCESSNSError EXC_BAD_ACCESS
【发布时间】:2011-10-24 23:21:51
【问题描述】:

我需要另一双眼睛来了解为什么在尝试将 NSError 分配给传递给函数的错误时会出错:

// Response and Error Objs.
NSURLResponse *response = nil;
NSError *requestError = nil;

// Attempt authentication
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];

// Error?
if (requestError != nil) {
    *error = requestError; // Error happens here
    return;
}

【问题讨论】:

  • 也许有人通过nil?定义在哪里?

标签: objective-c exc-bad-access nserror


【解决方案1】:

来自 Apple 的Error Handling Programming Guide

重要提示:成功或失败由 方法。虽然 Cocoa 方法间接返回错误对象 Cocoa 错误域保证返回这样的对象,如果 方法直接返回 nil 或 NO 表示失败,你应该 在尝试之前总是检查返回值是 nil 还是 NO 对 NSError 对象做任何事情。

在这种情况下,-sendSynchronousRequest:returnResponse:error: 返回一个 NSData 对象。在继续错误之前,您应该检查它是否为 nil。

【讨论】:

    【解决方案2】:

    你忘记了 NSError:

    if (requestError != nil) {
        NSError *error = requestError; // Error happens here
        return;
    }
    

    或者error 声明/定义的位置/时间以及将一个错误对象分配给另一个错误对象的意义何在?为什么不只是:

    if (requestError != nil) {
        NSLog(@"%@", [requestError localizedDescription]);
        return;
    }
    

    【讨论】:

      【解决方案3】:

      很可能*error 没有指向有效的指针;样本不完整,所以我不能肯定。也许*error 为零。

      【讨论】:

        【解决方案4】:

        您不能在您尝试使用的表单中使用“错误”。您可以访问 NSURLConnection 中的错误,但不能访问它之外。 因此,您需要在使用之前定义错误对象。

        【讨论】:

          【解决方案5】:

          假设您有一个接受NSError** 的方法签名。

          这意味着该方法接受一个指针,该指针指向一个指向NSError 值的指针。

          所以,我怀疑因为错误是 NULL,所以你基本上是在问那个 NULL 对象它所指向的东西的值是什么。但是,当然,您不能向 NULL 对象询问该信息,这就是它崩溃的原因。

          因此,在尝试设置*error 的值之前,您需要检查error 不是NULL,如下所示:

          if (error == NULL) {
              // the function caller has supplied us with a nil as an argument
              // this indicates the caller does not care about the error
              return;
          }
          

          您必须检查NULL 而不是nil 的原因是因为您检查的是内存位置而不是可可对象。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-15
            • 1970-01-01
            • 1970-01-01
            • 2015-03-11
            • 1970-01-01
            相关资源
            最近更新 更多