stringWithUTF8String возвращает ноль после обновления iOS 8.2

Я использовал stringWithUTF8String для преобразования моих NSData в NSString следующим образом:

if ([[NSString stringWithUTF8String:[responsedata bytes]] isEqualToString:@"SUCCESS"]){
    dostuff...
}

Он работал нормально; однако после обновления iOS 8.2 [[NSString stringWithUTF8String:[responsedata bytes]] возвращал ноль.

Я решил проблему, используя следующий код:

NSString *responseDataString = [[NSString alloc] initWithData:responsedata encoding:NSUTF8StringEncoding];

if ([responseDataString isEqualToString:@"SUCCESS"]){
    dostuff...
}

В обоих случаях напечатанное описание responsedata было одинаковым: <OS_dispatch_data: data[0x7aeb6500] = { leaf, size = 7, buf = 0x7c390360 }>

Мой вопрос: ПОЧЕМУ первый вариант вернет ноль, и ПОЧЕМУ вдруг после обновления iOS 8.2?


person Stephan    schedule 12.03.2015    source источник
comment
Звучит как ошибка, я предлагаю вам отправить отчет об ошибке в Apple.   -  person rckoenes    schedule 12.03.2015


Ответы (1)


stringWithUTF8String ожидает буфер с завершением NUL, но ваш NSData не завершен NUL.

В вашем примере ваш NSData содержит 7 байтов, а ожидаемое значение также равно 7 символам. Иногда это может работать, когда за памятью в NSData следует NUL, но часто это не работает.

Единственный безопасный способ преобразовать NSData, не завершающийся NUL, — это также сообщить NSString длину вашего буфера, как вы делаете в своем решении.

person kevin    schedule 13.03.2015
comment
Спасибо за объяснение! Так что это не обязательно проблема с iOS 8.2, скорее мне просто повезло, что раньше это работало... - person Stephan; 17.03.2015