Почему это условие вызывает ошибку? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть метод, который содержит несколько условий.Первый условно работает нормально и не вызывает никаких проблем.Однако второй вызывает сбой приложения.

- (void)didReceiveGaiaGattResponse:(CSRGaiaGattCommand *)command
{
    GaiaCommandType cmdType = [command getCommandId];
    NSData *requestPayload = [command getPayload];
    uint8_t success = 0;

    NSLog(@"cmdType: %li", (long)cmdType);
    [requestPayload getBytes:&success range:NSMakeRange(0, sizeof(uint8_t))];

    if (cmdType == GaiaCommand_GetCurrentBatteryLevel && requestPayload.length > 1)
    {
        uint16_t value = 0;
        [requestPayload getBytes:&value range:NSMakeRange(1, sizeof(uint16_t))];
        NSInteger battery = CFSwapInt16BigToHost(value);

        [self sendEventWithName:someDEVICE_BATTERY_CHANGED body:@{@"batteryLevel":[NSNumber numberWithInteger:battery]}];
        return;
    }
     else if (cmdType == GaiaCommand_GET_FBC && requestPayload.length > 1)
    {
         uint16_t value = 0;
         [requestPayload getBytes:&value range:NSMakeRange(1, sizeof(uint16_t))];
         NSInteger feedbackCancellationMode = CFSwapInt16BigToHost(value);
         [self sendEventWithName:FEEDBACK_CANCELLATION_MODE body:@{@"feedbackCancellationMode": [NSNumber numberWithInt:feedbackCancellationMode]}];
         return;
    }

    //do more stuff
}

Условный

if (cmdType == GaiaCommand_GetCurrentBatteryLevel && requestPayload.length> 1)

работает без проблем.

Тем не менее, условное

else if (cmdType == GaiaCommand_GET_FBC && requestPayload.length> 1)

вызываетследующее предупреждение в xcode

Неявное преобразование теряет целочисленную точность: «NSInteger» (он же «long») в «int»

Кроме того, я также увидел ошибкусообщение в отладчике

* Завершение работы приложения из-за необработанного исключения 'NSRangeException', причина: '* - [_ NSInlineData getBytes: range:]: range {1, 2} превышает

длина данных 2 '

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Подумайте, что это говорит вам:

Terminating app due to uncaught exception 'NSRangeException', reason:
'-[_NSInlineData getBytes:range:]: range {1, 2} exceeds data length 2'

Ваш объект данных имеет длину 2 байта. Первый байт в позиции 0 (в соответствии с вашим кодом) является значением success. Это оставляет еще один байт в позиции 1 для обработки. Но ваш код - это попытка скопировать из него 2 байта - это range {1, 2} в сообщении; диапазон начинается с позиции 1 и имеет длину 2. Вы читаете после конца данных.

Вы должны убедиться, что в данных достаточно данных, чтобы удовлетворить вызов -getBytes:..., который вы пытаетесь сделать. Вам также может потребоваться исправить ваши предположения о том, насколько большим должно быть значение режима отмены в буфере, потому что оно явно меньше, чем вы ожидаете. Ваш код предполагает, что это uint16_t (2 байта), но в данных остался только один байт.

0 голосов
/ 12 июня 2019
[NSNumber numberWithInt:feedbackCancellationMode]}]

должно быть

[NSNumber numberWithInteger: feedbackCancellationMode]}]
...