Ваш пример оставляет много переменных для опроса любым потенциальным помощником.Например: что, если с этим unarchiver есть что-то прикольное?Правильно ли управляется память?
Мне удалось воспроизвести сбой, который вы видите, и я могу подтвердить, что это происходит только при включенном параметре -O3, а не при выборе, например, Нет, для оптимизации.Здесь приведено сокращение кода сбоя, который устраняет внешние переменные, такие как управление памятью кодеров и т. Д. Обратите внимание, что в приведенном ниже коде целенаправленно сохраняются все объекты, чтобы исключить вероятность того, что сбой связан со случайным перепуском или побочнымЭффект от использования ARC, как было предложено Энди в другом ответе:
typedef struct
{
NSInteger x;
NSInteger y;
}
BBPointI32;
- (void) testDecoding
{
NSString* myKey = @"Testing";
// First get an coder with bytes in it
NSMutableData* myData = [[NSMutableData data] retain];
NSKeyedArchiver* myCoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:myData];
BBPointI32 encodedStruct = {1234, 5678};
[myCoder encodeBytes:(const uint8_t *)&encodedStruct length:sizeof(encodedStruct) forKey:myKey];
[myCoder finishEncoding];
// Now decode it
BBPointI32 decodedStruct;
NSUInteger decodedLength = 0;
NSKeyedUnarchiver* myDecoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:myData];
uint8_t* data = (uint8_t*)[myDecoder decodeBytesForKey:myKey returnedLength:&decodedLength];
decodedStruct = *(BBPointI32*)data;
NSLog(@"Got decoded struct with x = %ld, y = %ld, length = %lu", decodedStruct.x, decodedStruct.y, decodedLength);
}
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSLog(@"Testing decoding");
[self testDecoding];
}
Я думаю, что это дает более краткое описание проблемы, которую любой, кто хочет помочь, может использовать в качестве основы для погружения. Моя догадкадо сих пор это ошибка оптимизации в LLVM 3.0, но, возможно, у кого-то еще будет лучшая теория о том, что происходит.
Точка, которую вы не упомянули в своем вопросе, но которую я заметил всбой на моем устройстве, это сбой, сопровождаемый упоминанием ошибки EXC_ARM_DA_ALIGN в качестве причины исключения плохого доступа.Я гуглил пост в блоге, который, похоже, ссылается на те же симптомы и, вероятно, является причиной сбоя, как вы видите здесь:
http://www.galloway.me.uk/2010/10/arm-hacking-exc_arm_da_align-exception/
Действительно, изменив строку выше
decodedStruct = *(BBPointI32*)data;
до
memcpy(&decodedStruct, data, sizeof(decodedStruct));
Кажется, что поведение при сбое смягчено, и код ведет себя как ожидалось.