ObjC / iOS:NSCFString不是NSString?

时间:2011-08-17 13:45:18

标签: objective-c ios json

我正在制作一个小型iOS应用程序,它请求带有ASIHTTPRequest的JSON文件,我希望它由JSONKit解析。我正在使用以下代码:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
        // yada yada

    NSURL *url = [NSURL URLWithString:@"http://localhost/file.json"]; // the file is a valid Json
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];
    [request setTimeOutSeconds:20]; // Response takes too long on local machine
    [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request {
    responseString = [request responseString]; // request type: ASIREQUEST, responseString is declared as NSString
    NSLog(@"%@ \n", [responseString class]); // NSCFString
        NSDictionary *deserializedData = [responseString objectFromJSONString];
}

但是,当应用程序运行时,我看到以下异常:

[7646:207] -[NSCFString objectFromJSONString]: unrecognized selector sent to instance 0xdba0000
[7646:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-`[NSCFString objectFromJSONString]: unrecognized selector sent to instance 0xdba0000'`

可能导致此异常的原因是什么?为什么我在这里显示我正在使用NSCFString,即使我正在指定NSString?

4 个答案:

答案 0 :(得分:15)

NSString被称为class cluster。这基本上意味着当你构造一个NSString时,你会得到一些保证行为像文档中定义的NSString一样的东西,但是可以由其他一些类实现。在这种情况下,NSCFString是系统决定返回的类型。

任何需要NSString的内容都会占用该群集中的任何内容。

从查看代码开始,ASI必须将objectFromJSONString定义为NSString.上类别的一部分。这对于群集系统完全正常,您是否正在加载包含ASI的静态库?如果是这样,您需要将-all_load和-ObjC添加到链接器标志中,以便从外部库中获取类别。

修改

根据您的评论,您的解决方案是确保JSON库包含在您的项目中。我假设objectFromJSONString是从某个样本复制/粘贴的。它是JSONKit库的一部分。确保项目中存在JSONKit.m和JSONKit.h。

更新: 包含JSONKit(.h和.m)但仍然是同样的错误...... 你是对的,我只是复制它,因为它似乎做了它的工作:)

答案 1 :(得分:5)

您已加入JSONKit.h,但您忘记在项目中加入JSONKit.m。它编译得很好,但是在运行时没有实现。

答案 2 :(得分:1)

我遇到了同样的问题,因为我启用了ARC,并且在纠正它之后JSonKit不支持它。

此外,当您包含JSonKit.h和.m文件时,请确保您也检查目标框。

答案 3 :(得分:0)

JSONKit在NSString上声明一个名为JSONKitDeserializing的类,以便允许您调用objectFromJSONString。确保在源文件中包含JSONKit.h,并尝试使用objectFromJSONString。