Ответ 1
Копирование моего ответа из fooobar.com/info/434580/... - вы, скорее всего, получите это сообщение из-за того, что вы вызываете getResponseString
при неудавшемся запросе. Вы должны убедиться, что вы проверяете, есть ли у вас ответ, прежде чем вызывать это: один из способов, который я обнаружил для проверки полного сбоя запроса (т.е. Сетевого/сервера вниз), - проверить:
if (request.responseStatusCode == 0) {
// the request failed entirely
} else {
// you at least got a HTTP response
}
Это происходит, если вы вызываете [asiHttpRequest getResponseString]
до того, как верный ответ был возвращен, и была установлена кодировка запроса (т.е. не удалось подключиться к серверу).
Самый простой способ обхода этого предупреждения - отредактировать класс ASIHTTPRequest
, удалить @synthesize responseEncoding
и добавить простой пользовательский getter/setter, чтобы вы могли вернуть кодировку по умолчанию, если кодировка ответа не установлена:
- (NSStringEncoding) responseEncoding
{
return responseEncoding || self.defaultResponseEncoding;
}
- (void) setResponseEncoding:(NSStringEncoding)_responseEncoding
{
responseEncoding = _responseEncoding;
}
Также существует более конкретный метод обхода метода getResponseString
, который, я думаю, является единственным местом, в котором используется кодировка, не проверяя значение - поскольку кодировка должна быть установлена для любого ответа с ненулевой длиной:
- (NSString *)responseString
{
NSData *data = [self responseData];
if (!data) {
return nil;
}
// --- INSERT THIS BLOCK ---
// If the 'data' is present but empty, return a simple empty string
if (data.length == 0) {
return @"";
}
//assert(self.responseEncoding); // if you're into runtime asserts, uncomment this
// --- END OF BLOCK TO INSERT ---
return [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:[self responseEncoding]] autorelease];
}