2013-04-06 1 views
0

У меня есть следующая функция:CGPDFDocumentCreateWithURL выходит из строя (Toll-Free шунтирующего из NSURL в CFURLRef)

- (void)loadPdfFromPath:(NSString*)path 
{ 
    NSURL *pathUrl = [NSURL URLWithString:path]; 

    _pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pathUrl); 
} 

Какой из документации я привожу к считаем, будет работать, потому что вы можете случаю от NSURL* к a CFURLRef через Toll-Free Bridging. Однако эта функция не работает, и я получаю следующий результат в журнале:

CFURLCreateDataAndPropertiesFromResource: код ошибки -15.

NB: -15 = kCFURLImproperArgumentsError

Однако, если я создаю реальную CFURLRef, она работает абсолютно нормально:

- (void)loadPdfFromPath:(NSString*)path 
{ 
    CGPDFDocumentRelease(_pdfDocument); 

    CFStringRef cgPath = CFStringCreateWithCString(NULL, [path UTF8String], kCFStringEncodingUTF8); 

    CFURLRef url = CFURLCreateWithFileSystemPath(NULL, cgPath, kCFURLPOSIXPathStyle, 0); 

    _pdfDocument = CGPDFDocumentCreateWithURL(url); 

    CFRelease(url); 
    CFRelease(cgPath) 
} 

Что мне не хватает? Я счастлив сохранить вторую функцию в своем коде, но я бы предпочел узнать, почему первый из них не работает.

ответ

5

Чтобы преобразовать путь файловой системы к URL-адресу, используйте

NSURL *pathUrl = [NSURL fileURLWithPath:path]; 

URLWithString ожидает RFC 2396, соответствующий URL-строки, как "HTTP: // ..." или «файл: /// ... », в том числе„схемы“и т.д.

Добавлено: Собственно NSURL *pathUrl = [NSURL URLWithString:path]; возвращает действительный объект, так что , кажется, работает, но чтение из этого URL (например, dataWithContentsOfURL) терпит неудачу.

+0

+1. Это не всегда будет работать, если 'path' имеет символы, которые недействительны в URL-адресе, например пробелы. –

+0

@KenThomases: Хорошо, спасибо за отзыв! –

2

Вам необходимо преобразовать NSString в CFStringRef, а затем вызвать CFURLCreateWithFileSystemPath;

CFStringRef aCFString = (__bridge CFStringRef)path; 
CFURLRef url = CFURLCreateWithFileSystemPath (NULL, aCFString, kCFURLPOSIXPathStyle, 0); 
NSLog(@"NSURL %@",url); 
Смежные вопросы