【问题标题】:float INFINITY can be archived by NSCoder, but not dearchivedfloat INFINITY 可以被 NSCoder 归档,但不能取消归档
【发布时间】:2013-06-12 07:29:34
【问题描述】:

我必须归档一个值为INFINITYfloat,然后才能取消归档。
这是我的示例代码:

要归档的对象:

@interface CodeInf : NSObject <NSCoding>
@end
@implementation CodeInf
- (void)encodeWithCoder:(NSCoder *)encoder {
    float inf = INFINITY;
    [encoder encodeFloat: inf forKey:@"INFINITY"];
}
- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
        float decodedInf = [decoder decodeFloatForKey: @"INFINITY"];
    }
    return self;
}
@end

这是归档/取消归档的代码:

CodeInf *myCodeInf = [[CodeInf alloc] init];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myCodeInf];
myCodeInf = [NSKeyedUnarchiver unarchiveObjectWithData:data];

存档有效,但取消存档会引发错误:

* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[NSKeyedUnarchiver decodeFloatForKey:]: value (inf) for 键 (INFINITY) 太大,无法容纳 32 位浮点数'

这是 dearchiver 中的错误,还是我有什么问题?

【问题讨论】:

    标签: ios objective-c archiving


    【解决方案1】:

    看起来像一个错误。向 Apple 提交错误报告。

    作为一种解决方法,使用 encodeDoubledecodeDoubleForKey - 您可以将值保留为 float,并且 C 规则不需要强制转换。

    【讨论】:

    • 感谢 CRD,我会提交错误报告,您的解决方法很好!
    • 嘿,@ReinhardMänner 你提交了错误报告吗?链接是什么?我们刚刚在 iOS 8.3 上遇到了类似的带有编码/解码浮点值的崩溃。谢谢!
    • @Danik:我在 2013 年 6 月 12 日提交了一份错误报告,但从未得到答复,而且它仍然开放。参考号是14126397。这是你要的“链接”吗?或者我怎样才能获得此报告的链接?
    • @ReinhardMänner 谢谢!刚刚提交了另一份报告,ID 为 20916424
    • 也遇到了这个问题。还没修好!
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多