Getting isEqualToString: unrecognized selector sent to instance error
I'm getting this error when clicking the same UIButton twice, it crashes the second time only when the request to the server is not able to go through.
-[SendHelloFax isEqualToString:]: unrecognized selector sent to instance 0x12b49150
Update: I used breakpoints and found that the line it is crashing at is:
if (!errorMessage || [errorMessage isEqualToString:@""])
{
errorMessage = @"Failed to send fax. Please check your WiFi or 3G connection and try again.";
}
Methods:
- (IBAction)sendFaxButtonClicked:(id)sender
{
NSString *errorMessage;
int rc开发者_高级运维ode = [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;
}
}
Best bet is that errorMessage
is not initialized and not set to a NSString
even though rcode
is not 0.
Try: NSString *errorMessage - nil;
and checking to insure errorMessage
is set in this instance.
When, at the beginning of your method, you define - without initialization -:
NSString *errorMessage;
you're in fact defining an id which has not been set to a valid value (that is a valid string using alloc-init or simply nil) so the memory area content pointed by errorMessage is not valid, that is it can be anything: an invalid area (which will lead to EXC_BAD_ACCESS) or another area previously taken by a now dealloc'd class (like in your case: this will raise an invalid selector exception) or in the worst case an area taken by another now dealloc'd NSString (difficult to debug!). Later you call sendFax:phone_call_id:... method which returns rcode and has as side effect to update the errorMessage pointer by let it point to a valid address (or nil). It doesn't and then when you check errorMessage you get one of the errors above. I suppose from your code that when rcode is set some error occurred. In such case this method must assign something to errorMessage, even a nil or an empty string, to avoid this error. So probably the sendFax: method is missing this detail.
精彩评论