[英]Delphi on OSX: how to convert CFDictionaryRef to NSDictionary?
根據Apple文檔, CFDictionaryRef
和NSDictionary
是Toll-Free Bridged Types
。 但是,我在下面的代碼中得到了一個AV,這可能是因為該橋不適用於Delphi。
DADiskCopyDescription
返回CFDictionaryRef
,我將其包裝為NSDictionary
。 指針不是NIL,但是當我訪問對象中的函數時,會得到一個AV:
function osxGetRootVolumeUUID: string;
var lNSDictionary: NSDictionary;
lDisk: DADiskRef;
lCFUrl: CFURLRef;
lSession: DASessionRef;
lUUID: CFUUIDRef;
begin
result := '';
lSession := DASessionCreate(nil);
lCFUrl := TNSURL.OCClass.fileURLWithPath(StrToNSStr('/'));
lDisk := DADiskCreateFromVolumePath(nil,lSession,lCFUrl);
lNSDictionary := TNSDictionary.Wrap(DADiskCopyDescription(lDisk));
lUUID := lNSDictionary.objectForKey(kDADiskDescriptionVolumeUUIDKey); //<- AV here
if lUUID<>nil then
result := CFStringRefToStr( CFUUIDCreateString(nil, lUUID));
lNSDictionary.release;
CFRelease(lCFurl);
end;
我也嘗試按照此SO問題的建議使用CFBridgingRelease
,但它給出了錯誤SIGABRT (6)
:
lNSDictionary := TNSDictionary.Wrap(CFBridgingRelease(DADiskCopyDescription(lDisk))); //gives error: SIGABRT (6)
如何使其運作?
PS。 基本上,我只想獲取OSX上根卷的UUID
。 上面的函數已從到目前為止使用的Objective-C函數轉換為Delphi。
編輯
我嘗試過的另一件事是避免使用NSDictionary
,但這也會產生錯誤,這可能表明問題是其他原因:
lCFDictionaryRef := DADiskCopyDescription(lDisk);
lUUID := CFDictionaryGetValue(lCFDictionaryRef, kDADiskDescriptionVolumeUUIDKey); //<- AV here
要將CFDictionaryRef轉換為TNSDictionary,您必須這樣做:
var LNSDict: NSDictionary;
LCFDict: CFDictionaryRef;
LCFDict := DADiskCopyDescription(lDisk);
try
LNSDict:= TNSDictionary.Wrap(LCFDict );
finally
CFRelease(LCFDict);
end;
所以這里的一切都很好,但是我認為您的影音可能正在訪問對象。 不要忘記在IOS中始終使用getObjectID而不是對象的指針
例如:傳遞給ios api (xxx as ILocalObject).GetObjectID
並且永遠不要直接傳遞給IOS api xxx
所以也許一定是(kDADiskDescriptionVolumeUUIDKey as ILocalObject).GetObjectID
或類似的東西
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.