我想在Objective-c模型中使用GUID作为唯一ID。我的问题是如何用我的NSCoder保存CFUUIDRef,因为它不是一个Object类型。
我一直在玩以下几行来编码/解码,但我似乎无法找到如何在objective-c中保存结构类型的任何好例子(我的所有NSObject类型都编码/解码很好)。 / p>
e.g。编码我正在尝试(我认为看起来不错?):
CFUUIDBytes bytes = CFUUIDGetUUIDBytes(uuid);
eencoder encodeBytes: &bytes length: sizeof(bytes)];
用于解码,这是我陷入困境的地方:
NSUInteger blockSize;
const void* bytes = [decoder decodeBytesForKey: kFieldCreatedKey returnedLength:&blockSize];
if(blockSize > 0) {
uuid = CFUUIDCreateFromUUIDBytes(NULL, (CFUUIDBytes)bytes);
}
我在上面输入了一个错误“转换为非缩放器类型” - 我已经尝试了几个我在网上看到过的代码。谁能指出我正确的方向? 添
答案 0 :(得分:2)
更简单(但效率更低)的方法是使用NSString
将其存储为CFString
(CFUUIDCreateString
),并使用CFUUIDCreateFromString
恢复UUID。< / p>
答案 1 :(得分:2)
您的代码的问题是解码的最后一行,“bytes”是指向CFUUIDBytes结构的指针,您试图将其转换为CFUUIDBytes结构本身,这是不正确的并且是正确的由编译器检测到。尝试将最后一行更改为:
uuid = CFUUIDCreateFromUUIDBytes(NULL, *((CFUUIDBytes*)bytes));
这里的想法是你将“bytes”转换为指向CFUUIDBytes(内部括号)的指针,然后取消引用指定的指针(外部括号)。外部括号不是严格必要的,但我用它们来使表达更清晰。
答案 2 :(得分:0)
基于给出的答案,我尝试了Eyal给出的投射方法以及Rob提出的NSData方法,我认为后者看起来更清晰,尽管我对其他人的想法感兴趣。
我最终得到了以下内容:
- (void)encodeWithCoder:(NSCoder *)encoder {
// other fields encoded here
CFUUIDBytes bytes = CFUUIDGetUUIDBytes(uuid);
NSData* data = [NSData dataWithBytes: &bytes length: sizeof(bytes)];
[encoder encodeObject: data forKey: kFieldUUIDKey];
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
// other fields unencoded here
NSData* data = [decoder decodeObjectForKey: kFieldUUIDKey];
if(data) {
CFUUIDBytes uuidBytes;
[data getBytes: &uuidBytes];
uuid = CFUUIDCreateFromUUIDBytes(NULL,uuidBytes);
} else {
uuid = CFUUIDCreate(NULL);
}
}
}