2013-02-08 130 views
2

我希望通過本研究瞭解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和比較他們的對象的平等;

  1. 當存在線程安全性問題時,比較ID可能更適合比較引用。引用點的內容(數據)可以在獲得引用後在您之後(通過另一個線程)進行更改。
  2. 或者即使在同一個線程中,爲了進一步使用而存儲的引用也會被一些其他無法預料的動作釋放和/或修改。

因此,我們可以使用類似引用的內容,並確保它們始終可以使用(當內存釋放時,引用可能會失效)。此外,當使用像ID這樣的一些數據而不是整個內容時,性能會得到優化。

Apple Core Graphics的CGColor中這個nextID的真正用意是什麼?它是否從先前的方法中遺留下來,因此不能完全放棄?

+2

你問這個結構體中的'nextID'字段是來自freequartz還是關於Core Foundation的,或者是關於Apple核心圖形的東西?無論如何,問題是什麼? – 2013-02-09 03:20:19

+0

我糾正了這個問題。我在問蘋果的Core Graphics。當我轉儲CGColor實例的內存並詢問它的意圖時,我觀察到ID字段。我尋找一些修改。工程。它的來源,並發現免費的石英項目也使用它,但它已被實施有點不同。它使用__kCGColorSpaceID,所以CGColorSpaceGetTypeID每次都必須返回一個新的遞增值,但事實並非如此。我拆解了源代碼,但沒有時間進行修改。掌握所有部分。所以我正在尋找一個人已經知道它。提前致謝。 – lockedscope 2013-02-09 09:11:32

回答

0

id表示nextID字段的行爲有點像內容摘要。它識別相同的對象內容 - 在這種情況下,顏色。

等於的對象,不得具有我們所知的相同參考。即使它們包含EQUAL數據並且實際上相等。黑色的RGB或黑色的BW ......兩者都是黑色:D(只是一個例子!) - 因此你需要比較它們的內容。

對於數字或日期或所以你可以找到...他們被稱爲標記號和標記日期。

+0

那麼,當引用已經相等時比較標識符值的基本原理是什麼? – lockedscope 2013-02-21 16:32:47

+0

那麼他們可以總是依靠的ID和不檢查指針(無論怎樣int穩定+其他) – 2013-02-21 20:27:24

+0

標識符和引用是用來檢查是否相等。用於該函數的下一個調用;他們正在使用標識符和ref。以確定它是否是相同的對象,並仍然有效。但似乎沒有必要檢查引用的相等性,因爲只有新引用用於執行函數內的操作。我們知道可以爲另一個實例創建引用,因此它不合適。此外,標識符只是遞增的(不會在實例釋放時遞減),因此它提供了引用的相等性(除非它不溢出)。 – lockedscope 2013-03-23 15:37:58