簡體   English   中英

如何在Objective-C中編碼/解碼CFUUIDRef

[英]How to encode/decode a CFUUIDRef in Objective-C

我希望在objective-c模型中有一個GUID作為唯一ID。 我的問題是如何用我的NSCoder保存CFUUIDRef,因為它不是一個Object類型。

我一直在玩以下幾行來編碼/解碼,但我似乎無法找到如何在objective-c中保存結構類型的任何好例子(我的所有NSObject類型都編碼/解碼很好)。

例如,我正在嘗試編碼(我認為看起來不錯?):

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);
}

我在上面給出了一個錯誤“轉換為非縮放器類型” - 我已經嘗試了幾個我在網上看到過的代碼。 誰能指出我正確的方向? 蒂姆

在容易(但有點更低效的)的方法是將其存儲為一個NSStringCFString使用) CFUUIDCreateString ,並恢復與所述UUID CFUUIDCreateFromString

您的代碼的問題是解碼的最后一行,“bytes”是指向CFUUIDBytes結構的指針,並且您正試圖將其轉換為CFUUIDBytes結構本身,這是不正確的並且被正確檢測到編譯器。 嘗試將最后一行更改為:

uuid = CFUUIDCreateFromUUIDBytes(NULL, *((CFUUIDBytes*)bytes));

這里的想法是你將“bytes”轉換為指向CFUUIDBytes(內部括號)的指針,然后取消引用指定的指針(外部括號)。 外部括號不是嚴格必要的,但我用它們來使表達更加清晰。

基於給出的答案,我嘗試了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);
        }
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM