JSONKit崩溃:iPad视网膜64位设备模拟器中的iOS 7 Xcode 5.1

时间:2014-09-12 08:59:25

标签: ios json nsstring 64-bit nsdictionary

我使用JSONKit库来解析字典并获取JSON字符串。对于普通设备(iOS7),一切都很好。但是当我在iOS 7-64位模拟器中运行应用程序时,它在以下方法中崩溃了:

- (NSString *)JSONString;

崩溃消息显示在JSONKit.m

的这一行上

enter image description here

试图找出它但却无法理清。

我最终得到了我们的本地NSJSONSerialization课程。

有没有人解决这个问题?

2 个答案:

答案 0 :(得分:4)

据我所知,有多个补丁版本试图修复你在这里提到的64位崩溃问题,例如: JSONKit 64bit crash fix by heroims

他们都试图修复那些麻烦的线来获取标记指针,"指向Objective-C对象的第一个指向"指向"是指向该对象类的指针":

*((void **)objectPtr) 

我写了一个简单的代码来模拟崩溃,

NSDictionary *dic = @{@"hi":@(4)};
void *keys[2], *objects[2];
CFDictionaryGetKeysAndValues((CFDictionaryRef)dic, (const void **)keys, (const void **)objects);
void *objectPtr = objects[0];
void *another = *((void **)objectPtr);//Only works for 32 bit machine
NSLog(@"%@",[another description]);

我的猜测是,对于64位编译器,apple更改了NSNumber的标记指针实现,导致崩溃。在这里查看标记指针的讨论stackoverflow.com/questions/5819387/why-is-nsnumber-immutable

如果我将NSDictionary *dic = @{@"hi":@(4)};更改为NSDictionary *dic = @{@"hi":@"hello"};,它就不会崩溃。

我在这里提到的补丁只使用了object_getClass,这似乎打败了原来的目的,"为什么不使用object_getClass()?..." (上面的评论)

就像你说的那样,我现在也最终使用了NSJSONSerialization类。

答案 1 :(得分:2)

JSONKit here的修补版本修复了64位问题。