JKDictionary 类是 JSONKit 私有的,不应以这种方式使用

Posted

技术标签:

【中文标题】JKDictionary 类是 JSONKit 私有的,不应以这种方式使用【英文标题】:The JKDictionary class is private to JSONKit and should not be used in this fashion 【发布时间】:2013-01-02 07:08:24 【问题描述】:

这是this 的后续问题 简而言之,我正在使我的应用程序与 ios 4.3 兼容,并在我的应用程序中使用支持 ios 4 的 AFNetworking 类版本 0.10.1。 这条线self.responseJSON = AFJSONDecode(self.responseData, &error); 给了我下面的错误。我对 jason 不太熟悉,并试图弄清楚这个错误的含义。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** - [JKDictionary allocWithZone:]: The JKDictionary class is private to JSONKit and should not be used in this fashion.'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x006ef5a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x018e6313 objc_exception_throw + 44
    2   CoreFoundation                      0x006a7ef8 +[NSException raise:format:arguments:] + 136
    3   CoreFoundation                      0x006a7e6a +[NSException raise:format:] + 58
...
...
26  libdispatch_sim.dylib               0x02888289 _dispatch_call_block_and_release + 16
27  libdispatch_sim.dylib               0x0288acb4 _dispatch_queue_drain + 250
28  libdispatch_sim.dylib               0x0288b2c2 _dispatch_queue_invoke + 49
29  libdispatch_sim.dylib               0x0288b593 _dispatch_worker_thread2 + 261
30  libsystem_c.dylib                   0x90093b24 _pthread_wqthread + 346
31  libsystem_c.dylib                   0x900956fe start_wqthread + 30

错误来自 JSONKit.m:

+ (id)allocWithZone:(NSZone *)zone

#pragma unused(zone)
    [NSException raise:NSInvalidArgumentException format:@"*** - [%@ %@]: The %@ class is private to JSONKit and should not be used in this fashion.", NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSStringFromClass([self class])];
    return(NULL);

在 ios 5 中,应用程序使用 self.responseJSON =[NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:&error]; 行,效果很好,但我当然不能在 ios 4 中使用它,因为不支持 NSJSONSerialization

我们将不胜感激。

【问题讨论】:

[JKDictionary alloc] 在您的项目中的任何位置吗? 没有。我应该把它放在哪里? 问题出在你的代码中某处你不应该在JKDictionary上调用alloc,所以希望你能够找出你的那部分代码在哪里. 我看到的与您的建议相关的唯一一行是if((dictionary = [[JKDictionary alloc] init]) == NULL) return(NULL); 内的JSONKit.m。但我猜这不是你要找的。​​span> 你使用的是哪个版本的 JSKONKit,我在 github 上的版本中没有看到。使用最新版本的 JSONKit 有帮助吗? 【参考方案1】:

我最终用 self.responseJSON = [[CJSONDeserializer deserializer] deserialize:self.responseData error:&error]; 替换了有问题的行

仅针对该行使用了不同的类 (TouchJSON),但现在效果很好。

【讨论】:

以上是关于JKDictionary 类是 JSONKit 私有的,不应以这种方式使用的主要内容,如果未能解决你的问题,请参考以下文章

JSONKit 是不是会造成内存泄漏?

内存泄漏 JSONKit iOS

使用 jsonkit 将 JSonString 反序列化为 NSArray

无法为 JSONkit 关闭 ARC

JSONKit 出错的解决方式

JSONKit:创建一个 json 格式的字符串