0

我有一个包含一些条件的方法。第一个条件工作正常,不会引起任何问题。但是,第二个导致应用程序崩溃。

- (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'

4

2 回答 2

1

考虑一下这告诉你什么:

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 个字节),但数据中只剩下一个字节。

于 2019-06-12T05:20:40.657 回答
0
[NSNumber numberWithInt:feedbackCancellationMode]}]

应该

[NSNumber numberWithInteger: feedbackCancellationMode]}]
于 2019-06-12T03:53:02.477 回答