如何在Objective-C中编码/解码CFUUIDRef

时间:2010-02-08 08:14:56

标签: objective-c guid

我想在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);
}

我在上面输入了一个错误“转换为非缩放器类型” - 我已经尝试了几个我在网上看到过的代码。谁能指出我正确的方向? 添

3 个答案:

答案 0 :(得分:2)

更简单(但效率更低)的方法是使用NSString将其存储为CFStringCFUUIDCreateString),并使用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);
        }
    }
  }