[英]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);
}
我在上面給出了一個錯誤“轉換為非縮放器類型” - 我已經嘗試了幾個我在網上看到過的代碼。 誰能指出我正確的方向? 蒂姆
在容易(但有點更低效的)的方法是將其存儲為一個NSString
( CFString
使用) 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.