【问题标题】: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;
}
【问题讨论】:
标签:
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 的原因是因为您检查的是内存位置而不是可可对象。