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

Swift Userdefaults 将 String 转换为 __NSCFString

iOS与JS交互实战篇(ObjC版)

IOS - 啥是 Swift 字符类型的 ObjC NSObject 等价物?