2010-04-30 68 views
2

我跑臨門該方法一樣快,我可以和好,所以很明顯,如果CGDataProviderCopyData()實際上是複製數據字節爲字節,那麼我認爲越快必須有一個更快的方式直接訪問那個數據......它只是內存中的字節。任何人都知道,如果CGDataProviderCopyData()實際上覆制數據?或者它只是創建一個指向現有數據的新指針?CGDataProviderCopyData()是否實際複製字節?或者只是指針?

+0

這個問題出現在這個問題的評論對話期間:http://stackoverflow.com/questions/2740173/iphone-get-a-pointer-to-the-data-behind-cgdataprovider/2740707#2740707 – jtrim 2010-04-30 13:03:49

回答

6

字節被複制。

內部一個CFData被創建(CFDataCreate)與該數據提供者的內容。 CFDataCreate函數總是進行復制。

+0

KennyTM - 謝謝回覆。這就是我所設想的,因爲Apple在文檔和命名約定中傾向於完全符合字面意思。你知道有一種方法可以直接訪問數據提供者後面的數據嗎?如果你有興趣,這裏有一個鏈接到另一個問題,描述我的興趣:http://stackoverflow.com/questions/2740173/iphone-get-a-pointer-to-the-data-behind-cgdataprovider/2740707#2740707 – jtrim 2010-04-30 14:52:51

+0

@jtrim:這將涉及私人API。 'CGAccessSessionCreate'然後''CGAccessSessionGetBytePointer'。 ouch ... – kennytm 2010-04-30 16:07:28

+0

這真是一個無賴。似乎有點愚蠢,但我相信他們有他們的理由。再次感謝您的幫助 – jtrim 2010-04-30 18:03:52

3

任何人都知道如果CGDataProviderCopyData()實際上覆制數據?或者它只是創建一個指向現有數據的新指針?

這些都是同樣的事情。指針是內存地址;根據定義,如果您在兩個地址處有相同的數據,它在兩個地方是相同的數據,所以您必須已將其複製(從一個到另一個或從共同來源到兩個地方)。

那麼,讓我們重申相應的問題:

或者它只是複製現有的指針?

石英不一定這樣做,因爲data providers do not necessarily provide an existing pointer,因爲它們實際上可以作爲基於流的(順序)提供者來實現。

直接訪問提供程序怎麼樣? Even those need not cough up a byte pointer;供應商可能只需要提供range-on-demand access

但如果它確實提供了一個字節的指針?那麼,the documentation for that說:

你不能移動或修改提供商的數據,直到Quartz調用你的CGDataProviderReleaseBytePointerCallback函數。

所以,可以想象,石英可以重用的指針。但是如果在釋放數據之前釋放數據提供者(導致您的ReleaseBytePointer回調被調用)會怎麼樣?

如果Quartz實現CFData或NSData的私有自定義子類,它可能會實現錯誤或接管調用ReleaseBytePointer的作業,因此如果您創建直接訪問提供程序並從中創建CFData並且釋放提供者,你仍然可以使用CFData對象。

但是,這是一個很大的IFS的。他們可能只是創建一個普通的舊的(在創建時的字節複製)CFData,這使得它成爲一個有效的性能問題。

分析它,看看它給你帶來多少痛苦。如果它足夠的理由擔心,那麼你就需要一些解決方案:

  • 你可以只實現ReleaseBytePointer作爲無操作(空函數體)等釋放這兩個供應商之後單獨發佈的字節數,確保做到和數據。理論上講,如果使用原始字節指針並且Quartz沒有實現自定義的CFData子類,則防止字節從CFData下消失。有點毛茸茸的。不幸的是,蘋果公司不能真正依靠你這樣做,所以我懷疑這實際上會有幫助。
  • 直接處理NS/CFData。創建數據提供者只是將它傳遞給Quartz,然後釋放它並在此後立即忘記它(不是你自己擁有它)。
  • 根據您的需要,您可能更願意將您的回調結構保留在實例變量中,並直接調用它們以複製部分數據。當然,如果這個解決方案適合你,那麼你不會有上面描述的問題,因爲你沒有創建一個你可以擁有我的字節指針直接訪問數據提供者。

CGDataProviderCreateWithCFData文檔沒有說是否會返回一個直接訪問數據提供者或沒有,所以你必須要慎之又慎的側面,如果這是你如何創造你的數據提供者。

+1

哇,謝謝你的擴展細節!所有這一切花費的努力非常感謝:) – jtrim 2010-05-03 10:27:38