2011-09-28 90 views
1

当两次单击相同的UIButton时,出现此错误,仅在对服务器的请求无法通过时才第二次崩溃。获取isEqualToString:发送到实例错误的无法识别的选择器

-[SendHelloFax isEqualToString:]: unrecognized selector sent to instance 0x12b49150

更新:我用的断点,发现它在崩溃的路线是:

if (!errorMessage || [errorMessage isEqualToString:@""]) 
{ 
     errorMessage = @"Failed to send fax. Please check your WiFi or 3G connection and try again."; 
    } 

方法:

- (IBAction)sendFaxButtonClicked:(id)sender 
{ 
    NSString *errorMessage; 
    int rcode = [MyDataSource sendFax:self.appointment phone_call_id:self.phone_call_id document_url:self.document_url targetId:self.contact_id targetName:self.name.text targetNumber:self.faxNumber.text coverSheetMessage:self.coverSheetMessage.text errorMessage:&errorMessage]; 

    if (rcode) { 
     if (!errorMessage || [errorMessage isEqualToString:@""]) { 
      errorMessage = @"Failed to send fax. Please check your WiFi or 3G connection and try again."; 
     } 

     UIAlertView *someError = [[UIAlertView alloc] initWithTitle: @"Error" message:errorMessage delegate: self cancelButtonTitle: @"Ok" otherButtonTitles: nil]; 
     [someError show]; 
     [someError release]; 
     return; 
    } 

    if (!rcode) { 
     [self dismissModalViewControllerAnimated:FALSE]; 
    } 
} 

+(int)sendFax:(int)appointment_id phone_call_id:(int)phone_call_id document_url:(NSString*)document_url targetId:(int)contactId targetName:(NSString*)targetName targetNumber:(NSString*)targetNumber coverSheetMessage:(NSString*)coverSheetMessage errorMessage:(NSString**)errorMessage 
{ 
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/ichrono/20110715/60b88126/fax_send/", [self getMyHost]]]; 

    ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease]; 
    [self addCurrentUserLoginToPostRequest:request];   

    [request setPostValue:[NSString stringWithFormat:@"%d", contactId] forKey:@"fax_contact_id"]; 
    [request setPostValue:[NSString stringWithFormat:@"%d", appointment_id] forKey:@"appointment_id"]; 
    [request setPostValue:[NSString stringWithFormat:@"%d", phone_call_id] forKey:@"phone_call_id"]; 

    [request setPostValue:document_url forKey:@"url_to_fax"]; 
    [request setPostValue:targetNumber forKey:@"fax_number"]; 
    [request setPostValue:targetName forKey:@"full_name"]; 
    [request setPostValue:coverSheetMessage forKey:@"coversheet_message"]; 


    [request startSynchronous]; 

    NSError *error = [request error]; 
    NSString *responseString; 
    if (!error) { 
     responseString = [request responseString]; 
    } else { 
     return -1; 
    } 

    NSMutableDictionary *temp = [responseString JSONValue]; 
    *errorMessage = [temp valueForKey:@"errors"]; 

    if ([[temp valueForKey:@"status"] isEqualToString:@"ok"]) { 
     return 0; 
    } else { 
     return -1; 
    } 
} 
+0

您可以尝试将'errorMessage'设置为'nil'(第一行代码)。这是引发异常的行:'if(!errorMessage || [errorMessage isEqualToString:@“”]){'? –

回答

1

最好的办法是errorMessage没有初始化即使rcode不为0,也不设置为NSString

尝试:NSString *errorMessage - nil;并检查确保errorMessage在此实例中设置。

1

时,在你的方法开始时,你定义 - 不用初始化 - :


NSString *errorMessage; 

你实际上定义尚未设置为有效id值(这是一个有效的字符串使用alloc-init或者简单的nil),所以errorMessage指向的内存区域内容是无效的,也就是说它可以是任何东西:一个无效的区域(这将导致EXC_BAD_ACCESS)或另一个区域以前由现在的dealloc'd类就像你的情况一样:这会引发一个无效的选择器异常),或者在最坏的情况下,另一个区域被另一个区域取消分配NSString(难以调试!)。 稍后,您将调用sendFax:phone_call_id:...方法,该方法返回rcode并通过让它指向有效地址(或nil)来更新errorMessage指针,从而产生副作用。它不会,然后当你检查errorMessage时,你会得到上面的错误之一。 我想你的代码,当rcode设置了一些错误发生。在这种情况下,此方法必须将某些内容分配给errorMessage,即使是零字符串或空字符串,以避免此错误。所以可能sendFax:方法缺少这个细节。

相关问题