2017-08-10 68 views
0

接受的答案使我正确地解释了问题。我也编辑问题按大写字母点使答案点使其清除器在C++中将CFString转换为CFStringRef和CFErrorRef为CFError

我在MacOSX中有一个C++代码,它使用了一点CoreFoundation。

我在我的代码中使用以下函数CFPropertyListCreateWithData,它将CFErrorRef *error作为其参数之一。嗯,我创建CFErrorRef myError并把它作为&myError

第一个问题:我认为这是在Documentation一个漏洞,因为它给了我一些很好的数据结果,但错误是NOT NULL。如果我有错误,数据应该是NULL,不是吗?还是我误解了文档?

第一个解决方案:如果没有错误,那么错误是无约束的,所以如果数据是空的,我必须检查错误。我想看看这是错误:而且我RELEASING使用CFRelease一个未定义的对象,错误,导致我的程序段故障

问题二崩溃。 那么我进入这个函数CFErrorCopyFailureReason,doc here, ,但它需要一个CFError而不是CFErrorRef,并给我一个CFString。那么,我如何将CFErrorRef转换为CFError?

解决方法二:NOSENSE问题,我正在读SWIFT的相关文档,而不是Objective-C的

第三个问题:功能CFErrorCopyFailureReason给我一个CFString,但我不知道在哪里CFString定义!它不在CoreFoundation/CoreFoundation.h中,也不在CoreFoundation/CFString.h中,并且在尝试编译时出现未定义的类型错误。 那么:在哪个文件中定义了CFString?我可以将它转换为CFStringRef,我该怎么做?

第三个解决方案:NOSENSE问题,我正在读SWIFT的文档,而不是Objective-C的

第四个问题:与我,如果我使用CFStringRefCFErrorRef代替CFStringCFError的代码,它编译,但后来我有一个NSInvalidArgumentException。编译时不应该有错误吗?我不喜欢RunTimeException ...第四种解决方案:如答案使我了解,我必须在数据为NULL时检查错误。在这种情况下,我正在检查一个带有未定义数据的错误,它使我知道了无效的变量异常。显然,由于问题在错误中存在未定义的值,这是运行时异常

嗯,总结一下,我只是想在我的C++应用程序中读写一个Info.plist文件。我从中获得灵感,Saving and Restoring Property Lists,示例代码并对其进行了相当多的修改。如果你有一个工作示例如何阅读和修改一个Info.plist文件,请告诉我:)但不使用PlistBuddy或其他工具,请仅使用C++ API。

得出结论:示例代码工作得很好,我只是误解了文档

感谢大家

+0

你应该显示你的代码。通常,在编译时无法检测到大量错误,并且只能在运行时检测到。如果你对bundle的Info.plist中的属性感兴趣,你应该考虑['CFBundle' API](https://developer.apple.com/documentation/corefoundation/cbbundle?language=objc)。 –

回答

2

我想你是误会了文档CFPropertyListCreateWithData():如果成功,返回值为非NULL ,什么error指向没有定义。除非CFPropertyListCreateWithData()返回NULL,否则不要担心error

CFErrorCopyFailureReason()确实需要CFErrorRef并返回CFStringRef。您可能正在查看它的Swift文档,将语言更改为文档页面顶部的Objective-C。

哪个调用抛出异常CFPropertyListCreateWithData()

+0

嗨布伦丹,谢谢,我认为这是问题所在。我看到Swift文档的一部分,正如你所说的,我也误解了文档。特别是(其他一些小问题),我有一个分段错误,我想因为我试图使用CFRelease来释放CFPropertyListCreateWithData中的错误,即使错误没有发生。 然后,在该函数中,我CF只在发生错误时才发布错误。你能证实这是正确的吗? – n3mo

+0

是的,这是正确的。 'CFPropertyListCreateWithData()'的头部声明:“如果解析数据时发生错误,则返回值为NULL。此外,如果发生错误并且错误参数为非NULL,则错误参数将设置为CFError描述了调用者必须释放的问题“ –