CGPDFDictionaryGetString函数nil参数异常

时间:2016-02-25 08:17:01

标签: ios objective-c swift file pdf

我发现在pdf中获取内容类型。我在this example上构建了我的代码,我试图从字典中读取内容类型。我发现类型的键是 Type 。但是我得到一个错误:

  

致命错误:在解包可选值时意外发现nil

这是我的代码:

pdfDoc = CGPDFDocumentCreateWithURL(url)

if (pdfDoc != nil) {
    let pdfCatalog=CGPDFDocumentGetCatalog(pdfDoc)
    var uriStringRef: UnsafeMutablePointer< CGPDFStringRef>!

    if (CGPDFDictionaryGetString(pdfCatalog, "Type", uriStringRef)) { //error
        print(uriStringRef)

    }
}

唯一的参数是uriStringRef。但是from the example,我不应该在传递给CGPDFDictionaryGetString之前设置为任何值,并且根据Apple's documentation,这应该根据键"Type"得到字符串返回值。我是对的吗?

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您正在将一个未初始化的指针传递给CGPDFDictionaryGetString方法,这是不安全的,因为您无法知道被调用的方法是否在写入之前尝试从指针读取。

来自Swift博客文章Interacting with C Pointers

  

作为输入/输出参数的指针

     

C和Objective-C不支持多个返回值,因此Cocoa API经常使用指针作为将额外数据传入和传出函数的方法。 Swift允许将指针参数视为inout参数,因此您可以使用相同的var语法将对&的引用作为指针参数传递。

     

为了安全起见,Swift要求在使用&传递变量之前对变量进行初始化。这是因为它无法知道被调用的方法是否在写入之前尝试从指针读取。

初始化CGPDFStringRef&#39;指针&#39;像这样:

var uriStringRef = CGPDFStringRef.init()

使用inout语法将其传递给方法:

CGPDFDictionaryGetString(pdfCatalog, "Type", &uriStringRef)