[英]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.