Как определить, почему NSMutableData недействителен
-
20-09-2019 - |
Вопрос
Я получаю доступ к RESTFUL URL и получаю обратно результаты.Результаты представлены в формате JSON.Я превращаю ответ в строку через:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *json = [[NSString alloc] initWithBytes:[self.receivedData mutableBytes] length:[self.receivedData length] encoding:NSUTF8StringEncoding];
Переменная json имеет значение 0x0.Когда я навожу на него курсор, я вижу <Invalid CFStringRef
>.Как я могу отладить это, чтобы определить, почему это недопустимо?Я рендерю JSON, переданный обратно через браузер, в анализаторе JSON.Это прекрасно проверяется.
Результаты будут возвращены путем ввода идентификатора в URL-адрес.Другие идентификаторы возвращают результаты без проблем.Результирующий набор довольно велик.
Решение
Сначала я бы использовал initWithData:encoding:
чтобы настроить NSString.Небольшая разница, но этот метод существует не просто так.
Затем я бы сделал шестнадцатеричный дамп из self.receivedData
чтобы увидеть, что там на самом деле.Если эти данные неправильно закодированы в UTF8, то initWithData:encoding:
потерпит неудачу.
(Google для шестнадцатеричного дампа NSData, чтобы найти служебные функции других людей для этого)
Я обнаружил, что иногда веб-сервисы неаккуратны в своей кодировке.Поэтому я обычно реализую запасной вариант, подобный этому:
NSString* html = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
if (html == nil) {
html = [[NSString alloc] initWithData: data encoding: NSISOLatin1StringEncoding];
if (html == nil) {
html = [[NSString alloc] initWithData: data encoding: NSMacOSRomanStringEncoding];
}
}
Немного печально, что это требуется, но многие веб-сервисы написаны или настроены неправильно.
Другие советы
Использование NSLog
чтобы посмотреть на байты.