我希望通過本研究瞭解CoreFoundation對象的內部情況。 下面給出CGColor的結構從free quartz project.CGColorRef對象的ID不透明類型
typedef struct CGColor {
CFRuntimeBase obj;
CFTypeID nextID;
CGColorSpaceRef colorSpace;
CGPatternRef pattern;
size_t numberOfComponents;
CGFloat *components;
} *CGColorRef;
的全局線程安全唯一值是保持其被遞增創建並分配給所述nextID構件每個CGColor對象。只有未記錄的CGColorGetIdentifier()函數返回該值。
我檢查過CoreGraphics及其資源庫。我發現只有ripc_GetColor(libRIP.A.dylib)函數調用CGColorGetIdentifier()函數,它似乎比較了一些顏色對的nextID值。對於CGColorGetIdentifier
調用堆棧(與幫助,使約nextID推論希望)
0 com.apple.CoreGraphics CGColorGetIdentifier + 0 1 libRIP.A.dylib ripc_GetColor + 112 2 libRIP.A.dylib ripc_DrawGlyphs + 1740 3 com.apple.CoreGraphics CGContextDelegateDrawGlyphs + 108 4 com.apple.CoreGraphics drawGlyphs + 284 5 com.apple.CoreGraphics CGContextShowGlyphsWithAdvances + 208
的CFEqual首先比較的參考,如果他們不相等,然後進行比較的內容,這樣比較引用是一個正確的方法。如果引用不會被改變,那麼創建和維護唯一的ID值將是一種浪費。
因此,可能需要一個唯一的ID和比較他們的對象的平等;
- 當存在線程安全性問題時,比較ID可能更適合比較引用。引用點的內容(數據)可以在獲得引用後在您之後(通過另一個線程)進行更改。
- 或者即使在同一個線程中,爲了進一步使用而存儲的引用也會被一些其他無法預料的動作釋放和/或修改。
因此,我們可以使用類似引用的內容,並確保它們始終可以使用(當內存釋放時,引用可能會失效)。此外,當使用像ID這樣的一些數據而不是整個內容時,性能會得到優化。
Apple Core Graphics的CGColor中這個nextID的真正用意是什麼?它是否從先前的方法中遺留下來,因此不能完全放棄?
你問這個結構體中的'nextID'字段是來自freequartz還是關於Core Foundation的,或者是關於Apple核心圖形的東西?無論如何,問題是什麼? – 2013-02-09 03:20:19
我糾正了這個問題。我在問蘋果的Core Graphics。當我轉儲CGColor實例的內存並詢問它的意圖時,我觀察到ID字段。我尋找一些修改。工程。它的來源,並發現免費的石英項目也使用它,但它已被實施有點不同。它使用__kCGColorSpaceID,所以CGColorSpaceGetTypeID每次都必須返回一個新的遞增值,但事實並非如此。我拆解了源代碼,但沒有時間進行修改。掌握所有部分。所以我正在尋找一個人已經知道它。提前致謝。 – lockedscope 2013-02-09 09:11:32