【问题标题】:__NSCFBoolean isEqualToString:]: unrecognized selector sent to instance__NSCFBoolean isEqualToString:]: 无法识别的选择器发送到实例
【发布时间】:2013-01-17 17:57:18
【问题描述】:

当我从JSON php 获取值时,我遇到了__NSCFBoolean isEqualToString 的问题:

我的代码如下:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        //convert to JSON
        for(id key in res) {
        id value = [res objectForKey:key];

        NSString *keyAsString = (NSString *)key;
        NSString *valueAsString = (NSString *)value;
        //NSCFBoolean
        /*if([value isKindOfClass:[NSNumber class]])
        {
            printf("Number");
        }
        else if([value isKindOfClass:[NSString class]])
        {
            printf("String --- \n");
            if([value isEqualToString:@"0"])
            {
                printf("Wrong \n");
            }
            else
            {
                printf("Right \n");
            }
        }*/
        NSLog(@"%@",[valueAsString class]);
        if([keyAsString isEqualToString:@"success"])
        {
            printf("Working \n");
        }
        else
        {
            printf("Not Working\n");
        }
        //Error is in below line
        if([valueAsString isEqualToString:@"0"])// strcmp([value objCType], @encode(BOOL)) == 1)
        {
            [self loginSuccess];
        }
        else if(strcmp([value objCType], @encode(BOOL)) == 0)
        {
            [self loginFailure];
        }
        NSLog(@"key: %@", keyAsString);
        NSLog(@"value: %@", valueAsString);
    }

} }

收到[__NSCFBoolean isEqualToString:]: 无法识别的选择器发送到实例 0x1dc9964 的问题

从昨天开始在谷歌搜索这个问题,但还没有解决方案。现在,NSCFBoolean 在 iOS 6.0 中也不可用。那么我该怎么做才能从JSON 字符串中检查“0”或“1”呢?请帮忙。

【问题讨论】:

    标签: objective-c json


    【解决方案1】:

    这是可疑的部分:

    if([keyAsString isEqualToString:@"success"] && [valueAsString isEqualToString:@"0"])
    {
    }
    

    keyAsString、valueAsString(可能是这个)或两者都不是字符串对象。为什么?我们无法从您的代码中知道这一点,可能您的 JSON 数据有问题。请向我们展示更多代码。

    编辑

    试试这个:

    if([keyAsString isEqualToString:@"success"] && [valueAsString isEqualToNumber:@(NO)])
    {
    }
    

    【讨论】:

    • keyAsString 很好,但 valueAsString 不起作用。刚刚检查过
    • 打印它的类是这样的: NSLog(@"%@",[valueAsString class]);它肯定是 __NSCFBoolean。
    • 请显示 JSON 字典。
    • 这是你想要的吗?未经检查的确切结果 - 2013-02-02 20:17:30.620 Sample[2052:c07] __NSCFBoolean 2013-02-02 20:17:30.621 Sample[2052:c07] 键:成功 2013-02-02 20:17 :30.621 Sample[2052:c07] 值:0 2013-02-02 20:17:30.621 Sample[2052:c07] __NSCFString 2013-02-02 20:17:30.622 Sample[2052:c07] 键:原因 2013-02 -02 20:17:30.622 Sample[2052:c07] value: 请输入有效的用户名或密码!
    • 尝试了 isEqualToNumber 与参数 (id *)value 不与 valueAsString 因为 valueAsString 是 NSString 类型。但是当我根据您的代码检查时发现另一个问题:( __NSCFString isEqualToNumber:]: unrecognized selector sent to instance 0x71d01c0
    【解决方案2】:

    value 是一个 NSNumber 对象(__NSCFBoolean,因为 NSNumber 是一个类簇)而不是一个字符串!使用[value boolValue]判断是0还是1。

    投射一个对象不会改变它的类型!

    【讨论】:

    • [valueAsString isEqualToString:@"0"]更改为[value boolValue] == 0
    • [value boolValue] == NO 会更好,![value boolValue] 会更好。
    • 太棒了 :) 非常感谢 Fabian :) 2 天后找到了正确的解决方案
    • @Jonathan Grynspan 是的,我知道,但我不想引起更多混乱;)
    • 哦,我现在才接受你的分析。 :) 我是新来的。所以以前不知道这个。
    猜你喜欢
    • 2011-10-16
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    相关资源
    最近更新 更多