【发布时间】:2017-05-29 09:55:43
【问题描述】:
根据Apple documentationCFDictionaryRef 和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;
我也尝试按照this SO question 中的建议使用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
【问题讨论】:
标签: macos delphi firemonkey