我正在制作一个小型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?
答案 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。