簡體   English   中英

在OSX上的Delphi:如何將CFDictionaryRef轉換為NSDictionary?

[英]Delphi on OSX: how to convert CFDictionaryRef to NSDictionary?

根據Apple文檔, CFDictionaryRefNSDictionaryToll-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.

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