NSString isEqualToString-无法识别的选择器发送到实例

One*_*nDc -1 objective-c nsstring ios

为什么我在以下位置将无法识别的选择器发送到实例

doesExist = [myStr isEqualToString:@"Hello"];

- (void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{

    NSLog(@"%s", __PRETTY_FUNCTION__);
    NSLog(@"Found %d peripheral as a result of scanning", myListOfPeripherals.count);

    NSString *strMACId = [advertisementData valueForKey:@"kCBAdvDataManufacturerData"];
    NSLog(@"%@", strMACId);



    [timerConnectionTimeout invalidate];
    PeripheralCell * objPeripheralCell;

    NSLog(@"Found Peripheral with Name: %@ RSSI data:%@ AdvData: %@", peripheral.name, peripheral.RSSI, advertisementData);

    // Check if the Peripheral already exists in your collection - if no add it.
    if ([self peripheralExistsWithMacId:strMACId] == false)
    {
        // New peripheral - Add it to the list of myPeripherals
        objPeripheralCell=[[PeripheralCell alloc] init];
        [myListOfPeripherals addObject: objPeripheralCell];
        objPeripheralCell.peripheral=peripheral;
        objPeripheralCell.rssi=RSSI;
        objPeripheralCell.peripheralMacId = strMACId;

    }

}




-(BOOL) peripheralExistsWithMacId:(NSString *)strMacId
{
    BOOL doesExist = false;
    for (int i=0; i<myListOfPeripherals.count; i++)
    {
        PeripheralCell *objPeripheralCell = myListOfPeripherals[i];
        NSString *myStr = objPeripheralCell.peripheralMacId;
        NSLog(@"Comparing %@ with %@", myStr, strMacId);
        **doesExist = [myStr isEqualToString:@"Hello"];**
        if (doesExist)
        {
            break;
        }
    }
    return doesExist;

}
Run Code Online (Sandbox Code Playgroud)

错误->> -[NSConcreteData isEqualToString:]: unrecognized selector sent to instance 0x7970e90

更新:NSLog(@“%@”,strMACId)产生<00ff6e62 61bacad8>如何确定这不是NSString对象

Put*_*103 5

您的代码行:

[advertisementData valueForKey:@"kCBAdvDataManufacturerData"];
Run Code Online (Sandbox Code Playgroud)

返回一个NSConcreteData,并将其分配给NSString类型的指针。您未在Xcode中收到任何代码错误的原因是,它认为您知道在分配给特定类型的指针时在做什么。然后,它会看到您正在调用isEqualToString一个它认为是NSString的指针,从而认为该调用完全是逻辑和功能。如果添加了一行代码(或什至是NSLog),则检查对象是否实际上是NSString,您会发现它不是。

if([strMACId isKindOfClass:[NSString class]])
{
    //This will return false for your case, and never get in here
}
Run Code Online (Sandbox Code Playgroud)

您需要做的是从NSDictionary中读取值,然后将其转换为NSString对象。您可以使用类似:

NSString* newStr = [[NSString alloc] initWithData:theData
                                         encoding:NSUTF8StringEncoding]
Run Code Online (Sandbox Code Playgroud)

但是,您将必须谨慎对待编码。有一些方法可以遍历编码样式,直到获得一种可以毫无错误地解码NSData的方法为止,但是我不确定您的数据是否可以正确解码为NSString。另一个选择是将PeripheralCell.peripheralMacIdNSData 的类型更改为NSData并比较数据以获得所需的内容。