我跑臨門該方法一樣快,我可以和好,所以很明顯,如果CGDataProviderCopyData()
實際上是複製數據字節爲字節,那麼我認爲越快必須有一個更快的方式直接訪問那個數據......它只是內存中的字節。任何人都知道,如果CGDataProviderCopyData()
實際上覆制數據?或者它只是創建一個指向現有數據的新指針?CGDataProviderCopyData()是否實際複製字節?或者只是指針?
回答
字節被複制。
內部一個CFData被創建(CFDataCreate)與該數據提供者的內容。 CFDataCreate函數總是進行復制。
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
@jtrim:這將涉及私人API。 'CGAccessSessionCreate'然後''CGAccessSessionGetBytePointer'。 ouch ... – kennytm 2010-04-30 16:07:28
這真是一個無賴。似乎有點愚蠢,但我相信他們有他們的理由。再次感謝您的幫助 – jtrim 2010-04-30 18:03:52
任何人都知道如果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
文檔沒有說是否會返回一個直接訪問數據提供者或沒有,所以你必須要慎之又慎的側面,如果這是你如何創造你的數據提供者。
哇,謝謝你的擴展細節!所有這一切花費的努力非常感謝:) – jtrim 2010-05-03 10:27:38
- 1. Objective-C只讀屬性是否需要指定強或複製?
- 2. 在java中做指針實際上是否存在?
- 3. 是否指針指定或不在C?
- 4. MongoDB指針或實際副本?
- 5. glUniformMatrix4fv是否即時複製傳入指針指向的數據?
- 6. 遊標是否有獨立的數據,或只是指向數據的指針?
- 7. 複製字符串指針,指針
- 8. 指針始終是字節對齊的
- 9. git pull是否複製所有的分支或只是主?
- 10. 是否只有Apache Axis wsdl2Java或者是否有其他庫?
- 11. ILMerge是否實際合併程序集,或者只是將所有內容都放在一個文件中?
- 12. 通過引用複製對象是否有實際用途?
- 13. BDD方案是否應包含實際測試數據,或只是描述它?
- 14. 從雙指針複製到int數組。它是否正確?
- 15. 將指向字符串的指針返回給調用者是否安全?
- 16. 指針實際上是如何按類型遞增的
- 17. C輸出可變位置(指針)而不是實際值
- 18. 是否使用指針
- 19. 知識庫:版權或只是複製?
- 20. VS2012是否還包含win32部件?或者它只是WPF?
- 21. setNeedsDisplay是否立即生效,或者只是稍後排隊?
- 22. 我們是否聲明'jQuery或者我們只是使用它?
- 23. 實際上是引用而不是複製PtrToStructure?
- 24. 複製引用指針或值
- 25. 如何知道指針是否是NSObject?
- 26. 什麼是複製的指針,它們是如何工作的?
- 27. 複製和指針
- 28. strcpy()複製指針?
- 29. 複製指針值
- 30. C++複製指針
這個問題出現在這個問題的評論對話期間:http://stackoverflow.com/questions/2740173/iphone-get-a-pointer-to-the-data-behind-cgdataprovider/2740707#2740707 – jtrim 2010-04-30 13:03:49