2011-02-23 64 views
1

我想對數據進行編碼類型CGPDFPageRef像這樣(源代碼),但我得到以下錯誤(控制檯錯誤消息):如何在Objective-c中編碼非C數據類型?

源代碼:

//Get a CGPDFPageRef to page 20 of the current PDF document ref 
CGPDFPageRef pageRef = CGPDFDocumentGetPage(myDocumentRef, 20); 

//Set up the paths for writing 
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"thisPage.wrapit"]; 

//Encode the CGPDFPageRef to the path 
NSValue *pageRefObj = [NSValue value:&pageRef withObjCType:@encode(CGPDFPageRef)]; 
[NSKeyedArchiver archiveRootObject:pageRefObj toFile:path]; 

控制檯錯誤消息:

-[NSKeyedArchiver encodeValueOfObjCType:at:]: unknown type encoding ('^')' 

我的理論:
我認爲錯誤是因爲編碼器無法識別CGPDFPageRef類型。所以...我如何編碼/存檔/存儲非對象數據類型(非C)?順便說一下,任何的方式,這將允許我將CGPDFPageRef存儲到磁盤就足夠了。謝謝。

Side-Note:
Apple Docs還聲明變長數據結構不能被編碼?我不知道這是否也是問題。 PDFPages在磁盤上大小不同,那麼CGPDFPageRef不透明類型會被視爲可變長度?我不知道。太糟糕了,這是不透明的。

+0

NSData的dataWithBytes:方法有幫助嗎? – 2011-02-23 03:58:23

+0

@darren感謝您的評論。你能詳細說明一下嗎?如何獲取CGPDFPageRef字節格式? – m0rtimer 2011-02-23 03:59:59

+0

@darren我玩過並設法獲取CGPDFPageRef的字節。但是我試圖將數據字節轉換回CGPDFPageRef時卡住了!有任何想法嗎? – m0rtimer 2011-02-23 04:18:44

回答

4

你的問題是,CGPDFPageRef是一個指向不完整結構的指針 - 結構的佈局對於編譯器是未知的,所以@encode(CGPDFPageRef)產生一個無效(不完整)編碼。

你必須問是否安全/有意義的歸檔不透明類型?如果類型本身不提供存檔,那麼您不知道它是否可以安全存檔。

在這種情況下,我建議您確定文檔,頁碼對並將其歸檔,使用該數據進行取消歸檔以創建CGPDFPageRef

+0

謝謝你。你是對的。相反,我已經採取了從PDF格式轉換和存檔取而代之的JPEG。乾杯 – m0rtimer 2011-02-24 12:16:42