ios: malloc: *** ошибка для объекта 0x6e78580: неверная контрольная сумма для освобожденного объекта - PullRequest
1 голос
/ 28 февраля 2012

У меня есть следующий метод:

- (NSString*) make_sychronous_POST_request_with_payload:(NSData*) payload
{
    NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://xyz.com"]];
    [request setHTTPMethod:@"POST"];

    NSData *postData = [[Base64 encodeBase64WithData:payload] dataUsingEncoding:NSASCIIStringEncoding];
    [request setHTTPBody:postData];

    NSURLResponse* response = [[NSURLResponse alloc] init];
    NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
    data = [Base64 decodeBase64WithString:[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]];

    return [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
}

Но для строки

NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

я получаю эту ошибку:

AppName(24163,0xa0c87540) malloc: *** error for object 0x6caf4b0: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
(gdb) up
#27 0x0006153b in -[FinTS30 checkForFinTS30BankWithURL] (self=0x6ca41a0, _cmd=0x9cdf8) at /path/to/project/AppName/FinTS30.m:72
72      NSString* answer = [self make_sychronous_POST_request_with_payload:message];
Current language:  auto; currently objective-c

Я не понимаю, почемуБывает.

(Кстати: здесь я явно хочу использовать синхронный запрос, а не асинхронный.)

РЕДАКТИРОВАТЬ: Хорошо, это действительно очень странно.Кажется, проблема вызвана объектом postData.Вот модифицированная версия моего кода, которая не вылетает

- (NSString*) make_sychronous_POST_request_with_payload:(NSData*) payload
{
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:bd.bankURL]];
[request setHTTPMethod:@"POST"];

NSData *postData = [[Base64 encodeBase64WithData:payload] dataUsingEncoding:NSASCIIStringEncoding];
[request setHTTPBody:postData];
[postData description]; //adding this prevents the code from crashing

NSURLResponse*  response = [[NSURLResponse alloc] init];
NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
data = [Base64 decodeBase64WithString:[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]];

return [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
}

Хотя это кажется довольно запутанным, я тестировал его несколько раз.Если я комментирую [postData description], код вылетает, если вызывается [postData description], все работает нормально.Что может вызвать такое странное поведение?

1 Ответ

0 голосов
/ 28 февраля 2012

Используете ли вы ARC в своем проекте? Попробуйте использовать для ответа модификатор __autoreleasing.

NSURLResponse __autoreleasing * response = [[NSURLResponse alloc] init];

Это может произойти из-за того, что переменная, которую вы передали методу, была освобождена и недействительна.

Дополнительная информация:

В каких ситуациях нам нужно написать квалификатор владения __autoreleasing под ARC?

...