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

Posted

技术标签:

【中文标题】JSONKit 崩溃:iPad 视网膜 64 位设备模拟器中的 iOS 7 Xcode 5.1【英文标题】:JSONKit Crash: iOS7 Xcode 5.1 in iPad ratina 64 bit device simulator 【发布时间】:2014-09-12 08:59:24 【问题描述】:

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

- (NSString *)JSONString;

并且崩溃消息显示在JSONKit.m 类的这一行

试图找出它但无法解决。

最后我得到了我们原生的NSJSONSerialization 类。

有人解决了吗?

【问题讨论】:

【参考方案1】:

据我所知,有不止一个补丁版本试图修复您在此处提到的 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 的标记指针实现,这会导致崩溃。在此处查看标记指针的讨论***.com/questions/5819387/why-is-nsnumber-immutable

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

我这里提到的补丁只是使用了object_getClass,这似乎违背了最初的目的,“为什么不直接使用object_getClass()?...”(上面的cmets)

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

【讨论】:

【参考方案2】:

有一个 JSONKit here 的补丁版本修复了 64 位问题等。

【讨论】:

以上是关于JSONKit 崩溃:iPad 视网膜 64 位设备模拟器中的 iOS 7 Xcode 5.1的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap 无法在 iPad 视网膜 mini iOS7 中使用相机

iPad Retina - iPad 使用 iPhone 视网膜图像

强制视网膜 iPad 使用非视网膜图像

iPad 第三代无法显示视网膜图像

NSJSONSerialization 是不是比 JSONKit 更容错、更健壮?

在视网膜 iPad 上应用图层蒙版会隐藏所有