2017-10-21 58 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 { 
     ...... 
相關問題