简体   繁体   中英

JSONKit Crash: iOS7 Xcode 5.1 in iPad ratina 64 bit device simulator

I have used JSONKit library to parse dictionary and get JSON string. All is well and good with normal devices (iOS7). But when i run application in iOS 7-64 bit simulator it was crashed at below method:

- (NSString *)JSONString;

And the crash message shows on this line of JSONKit.m class

在此处输入图片说明

Tried to find out it but not able to sort out.

And i ended up with our native NSJSONSerialization class.

Did any one sort out this?

As far as I know there are more than one patch versions that tried to fix the 64 bit crash issue you mention here, eg JSONKit 64bit crash fix by heroims .

They all tried to fix that troublesome line for getting tagged pointers , "the very first thing that a pointer to an Objective-C object "points to" is a pointer to that objects class":

*((void **)objectPtr) 

I wrote a simple code to emulate the crash,

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]);

My guess is that for 64bit compiler, apple changed the tagged pointer implementation for NSNumber, which causes the crash. Check the discussion for tagged pointers here stackoverflow.com/questions/5819387/why-is-nsnumber-immutable

If I change NSDictionary *dic = @{@"hi":@(4)}; to NSDictionary *dic = @{@"hi":@"hello"}; it won't crash.

The patch I mentioned here just used object_getClass, which seems to defeat the original purpose, "Why not just use object_getClass() ?..." (the comments right above)

So like you said now I also end up using NSJSONSerialization class.

有JSONKit的修补版本在这里 ,修复等64个问题。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM