gpt4 book ai didi

iphone - 取消引用 NSCoder 的decodeBytesForKey 返回的指针时,iOS 设备崩溃

转载 作者:行者123 更新时间:2023-12-03 18:34:39 25 4
gpt4 key购买 nike

在使用 Apple LLVM 编译器 3.0 并使用 -O3 进行编译时,我发现 NSCoder 出现了异常崩溃。它只会在设备上崩溃。我测试了运行 iOS 5 的 iPhone 4、运行 iOS 5 的 iPad 2 和运行 iOS 4 的 iPad 1。所有崩溃都是相同的。这是相关代码部分:

-(id)initWithCoder:(NSCoder*)decoder
{
if (![super init])
{
return nil;
}

NSUInteger length = 0;

uint8_t* data = (uint8_t*)[decoder decodeBytesForKey:BBKey returnedLength:&length];

m_value = *(BBPointI32*)data;

return self;
}

这是 BBPointI32 的含义:

typedef struct
{
NSInteger x;
NSInteger y;
}
BBPointI32;

EXC_BAD_ACCESS 发生在data 被取消引用时。这不是空指针问题。如果我附上GDB,我可以看到长度是8,sizeof(BBPointI)也是8,数据是正确的。

如果我查看反汇编,崩溃发生在:

ldrd    r2, r3, [r0]

看起来不错。 r0包含0xb546e,这是data的地址。当我检查该内存时,我可以看到它包含我期望的数据。对于感兴趣的人,r2 包含 72(不确定那是什么),r3 包含 8(很可能是 length 的值)。

有人能解释一下这个问题吗?

最佳答案

ldrd 需要地址是 8 字节对齐的。 *(BBPointI32 *)data 习惯用法并不安全,因为数据不是 8 字节对齐的。使用 memcpy 将字节获取到结构中。

关于iphone - 取消引用 NSCoder 的decodeBytesForKey 返回的指针时,iOS 设备崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7729107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com