2017-10-21 60 views
1

我正在使用NSXMLParser来解析来自卡处理器的xml响应。此代码几年前一直运行正常,直到升级到xcode 9并在iOS11上运行。现在我得到一个无法识别的选择器,未捕获的异常崩溃。我在iPhone 7设备上运行xcode。分配委托时出现无法识别的选择器崩溃

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
    if (!error) { 
     DLog(@"received XML response: %@", response); 
     [MBProgressHUD hideAllHUDsForView:[[UIApplication sharedApplication] keyWindow] animated:YES]; 
     [self performSelectorOnMainThread:@selector(XMLRequestSucceeded:) withObject:response waitUntilDone:YES]; 
    } else { 
     ...... 

(I get to here:) 
-(void) XMLRequestSucceeded:(NSXMLParser *) response { 
    response.delegate = self; *** crashes here **** 
    self.responseDict = [NSMutableDictionary dictionaryWithCapacity:20]; 
    [response parse]; 

    DLog(@"parser result %@", responseDict); 

这里是标头:

..... 
#import <Foundation/NSXMLParser.h> 

@protocol NSXMLParserDelegate; 

@interface PaymentProcessor : NSObject <NSXMLParserDelegate> { 
} 
..... 

错误消息:

[NSHTTPURLResponse setDelegate:]:无法识别的选择发送到 实例0x1c44356a0

以前有在xcode 9或iOS11中发生了变化c会导致这次崩溃?感谢您的意见。

+1

这些都没有让任何意义。为什么你将'response'(类型为'NSURLResponse')传递给一个需要'NSXMLParser'类型的参数的方法呢?为什么你甚至使用'performSelector'?有更好的方法。 – rmaddy

+0

感谢你的回应。是你提出的更好的方法吗? –

+1

暂时忽略使用'performSelector',你需要弄清楚为什么你要传递一个'NSURLResponse'给一个需要'NSXMLParser'的方法。你为什么这么做? – rmaddy

回答

0

我解决了我的问题(在ma​​ddy的评论帮助下)。我将传递给XMLRequestSucceeded的参数更改为responseObject而不是响应。我现在传递要解析的NSXMLParser数据。说得通。我只是不知道为什么这个代码成功地工作了2年多了!

修复:

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
    if (!error) { 
     DLog(@"received XML response: %@", response); 
     [MBProgressHUD hideAllHUDsForView:[[UIApplication sharedApplication] keyWindow] animated:YES]; 
     [self performSelectorOnMainThread:@selector(XMLRequestSucceeded:) withObject:responseObject waitUntilDone:YES]; 
    } else { 
     ...... 
相关问题