【问题标题】:CGPDFDictionaryGetString function nil parameter exceptionCGPDFDictionaryGetString 函数无参数异常
【发布时间】:2016-02-25 08:17:00
【问题描述】:

我发现无法获取 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"的字符串返回值。我说的对吗?

我该如何解决这个问题?

【问题讨论】:

    标签: ios objective-c swift file pdf


    【解决方案1】:

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

    来自 Swift 博文Interacting with C Pointers

    指针作为输入/输出参数

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

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

    所以像这样初始化CGPDFStringRef'指针':

    var uriStringRef = CGPDFStringRef.init()
    

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

    CGPDFDictionaryGetString(pdfCatalog, "Type", &uriStringRef)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2018-09-05
      相关资源
      最近更新 更多