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 视网膜图像