Получение isEqualToString: нераспознанный селектор отправлен на ошибку экземпляра - PullRequest
1 голос
/ 28 сентября 2011

Я получаю эту ошибку, когда дважды нажимаю на одну и ту же кнопку UIB, во второй раз происходит сбой, только если запрос к серверу не может быть обработан.

-[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;
    }   
}

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Когда в начале вашего метода вы определяете - без инициализации -:


NSString *errorMessage;

вы на самом деле определяете идентификатор, для которого не установлено допустимое значение (которое является действительнымстрока с использованием alloc-init или просто nil), поэтому содержимое области памяти, на которое указывает errorMessage, недопустимо, то есть может быть любым: недопустимой областью (которая приведет к EXC_BAD_ACCESS) или другой областью, ранее занятой классом теперь dealloc'd(как в вашем случае: это вызовет недопустимое исключение селектора) или, в худшем случае, область, занятая другим, теперь уже полученным NSString (трудно отладить!).Позже вы вызываете метод sendFax: phone_call_id: ..., который возвращает rcode и имеет побочный эффект для обновления указателя errorMessage, позволяя ему указывать на действительный адрес (или ноль).Это не так, и тогда, когда вы проверяете errorMessage, вы получаете одну из ошибок выше.Я полагаю из вашего кода, что при установке rcode произошла какая-то ошибка.В таком случае этот метод должен назначить что-то errorMessage, даже ноль или пустую строку, чтобы избежать этой ошибки.Так что, вероятно, метод sendFax: пропускает эту деталь.

1 голос
/ 28 сентября 2011

Лучшая ставка в том, что errorMessage не инициализируется и не устанавливается в NSString, даже если rcode не равно 0.

Попробуйте: NSString *errorMessage - nil; и установлена ​​проверка для обеспечения errorMessageв этом случае.

...