【问题标题】:ObjC / iOS: NSCFString not NSString?ObjC / iOS:NSCFString 不是 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?

【问题讨论】:

    标签: objective-c ios json


    【解决方案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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-30
          • 1970-01-01
          相关资源
          最近更新 更多