【发布时间】:2010-12-03 04:03:51
【问题描述】:
我在传回 NSError 对象时遇到问题。访问对象的第一行代码(在本例中,我插入了一个 NSLog)导致“EXC_BAD_ACCESS”。
这是因为我没有显式创建一个 NSError 对象,而是从 NSURLRequest 中获取一个并将其传回吗?在这个特定的函数 (downloadFile:) 中,我想从其他函数中检索一些错误,但我在函数中的另外两个场合创建了 NSError。
感谢任何帮助。
这是有问题的代码:
-(void)someCode {
NSError *err = nil;
localPool = [[NSAutoreleasePool alloc] init];
if (!iap) {
iap = [[InAppPurchaseController alloc] init];
}
if (![self.iap downloadFile:@"XXXXX.plist" withRemoteDirectory:nil withLocalDelete:YES withContentType:@"text/xml" Error:&err] ) {
//"EXC_BAD_ACCESS" on calling NSLog on the next line?
NSLog(@"Error downloading Plist: %@", [err localizedDescription]);
[self performSelectorOnMainThread:@selector(fetchPlistFailed:) withObject:err waitUntilDone:NO];
[localPool drain], localPool = nil;
return NO;
}
//Removed the remainder of the code for clarity.
[localPool drain], localPool = nil;
return YES;
}
-(BOOL)downloadFile:(NSString *)fileName
withRemoteDirectory:(NSString *)remoteDirectory
withLocalDelete:(BOOL)withLocalDelete
withContentType:(NSString *)contentTypeCheckString
Error:(NSError **)error {
UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;
NSError *localError = nil;
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
NSString *urlString = [NSString stringWithFormat:@"http://XXXXX/%@", fileName];
NSLog(@"Downloading file: %@", urlString);
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url];
NSHTTPURLResponse *response = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&localError];
[req release];
if (response == nil || localError) {
NSLog(@"Error retrieving file:%@", [localError localizedDescription]);
if (error != NULL) {
*error = localError;
//THIS NSLog call works just fine.
NSLog(@"Error copied is:%@", [*error localizedDescription]);
}
[localPool drain], localPool = nil;
app.networkActivityIndicatorVisible = NO;
return NO;
}
//Rest of function omitted for simplicity.
}
【问题讨论】:
-
对与问题无关的代码的一个观察:检查
sendSynchronousRequest:是否因错误而失败的方法是检查其返回值为 nil,not 响应范围。如果 responseData 为 nil,localError 指向的错误将是一个有效的错误信息,否则你应该忽略它。因此,您对 localError 的检查以查看它是否为 nil 是没有意义的,并且您对响应的检查是不正确的。实际上,您不妨将错误传递为NSError**并保存复制。 -
优秀的捕捉和评论!我会根据您的建议进行更改。
标签: iphone objective-c nserror