ObjC/iOS:NSCFString不是NSString?

Got*_*chi 3 json objective-c ios

我正在制作一个小型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];
}
Run Code Online (Sandbox Code Playgroud)

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

[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'`
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*erg 15

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

任何需要NSString遗嘱的东西都会占用该集群的一部分.

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

编辑:

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

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


Rob*_*ier 5

你已经包括在内JSONKit.h,但是你忘了JSONKit.m在项目中加入.它编译得很好,但实现不是在运行时.