ObjC / iOS:NSCFString 不是 NSString?
Posted
技术标签:
【中文标题】ObjC / iOS:NSCFString 不是 NSString?【英文标题】:ObjC / iOS: NSCFString not NSString? 【发布时间】:2011-08-17 13:45:18 【问题描述】:我正在制作一个小型 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?
【问题讨论】:
【参考方案1】:NSString
被称为class cluster。这基本上意味着当你构造一个NSString
时,你将得到一些保证其行为类似于其文档中定义的NSString
的东西,但可以由其他一些类实现。在这种情况下,NSCFString
是系统决定返回的类型。
任何采用NSString
的东西都将采用属于该集群的任何东西。
通过查看您的代码,ASI 必须将 objectFromJSONString
定义为 NSString.
上的类别的一部分 这将与集群系统完美配合,您是否加载了包含 ASI 的静态库?如果是这样,您需要将 -all_load 和 -ObjC 添加到链接器标志中,以使类别能够从外部库中工作。
编辑:
根据您的 cmets,您的解决方案是确保 JSON 库包含在您的项目中。我假设objectFromJSONString
是从某处的某个样本中复制/粘贴的。它是JSONKit
库的一部分。确保您的项目中同时存在 JSONKit.m 和 JSONKit.h。
更新: 包含 JSONKit(.h 和 .m)但仍然是相同的错误... 你是对的,我只是复制它,因为它似乎完成了它的工作:)
【讨论】:
+1。此外,我不知道NSString
上的方法-objectFromJSONString
。
如果有记忆,它是用于在 Objective-C 中解析 JSON 的库的一部分。
我已经发现,需要设置链接器标志,但这并不能解决我的问题:/
更新:包含 JSONKit(.h 和 .m)但仍然是相同的错误......你是对的,我只是复制它,因为它似乎完成了它的工作 :)
Okey 伙计们,感谢您再次强迫我包含 JSONKit ;) 在重新启动 Xcode 并重新包含它之后,它就像一个魅力!谢谢!【参考方案2】:
您已包含JSONKit.h
,但您忘记在项目中包含JSONKit.m
。它编译得很好,但在运行时没有实现。
【讨论】:
【参考方案3】:我有同样的问题,因为我启用了 ARC 并且 JSonKit 在纠正它之后不支持它。
此外,当您包含 JSonKit.h 和 .m 文件时,请确保您也选中目标框。
【讨论】:
【参考方案4】:JSONKit 在 NSString 上声明了一个名为 JSONKitDeserializing 的类别,以便允许您调用 objectFromJSONString。确保您已在尝试使用 objectFromJSONString 的源文件中包含 JSONKit.h。
【讨论】:
以上是关于ObjC / iOS:NSCFString 不是 NSString?的主要内容,如果未能解决你的问题,请参考以下文章
fetchedResultsController fetchedObjects 返回一个 NSCFString 而不是 NSArray
iOS7 只返回 'NSInvalidArgumentException',原因:'-[__NSCFString containsString:]: [duplicate]
NSMutableDictionary 转换成 __ NSCFString