2012-05-06 403 views
0

我有這樣定義的的UIColor:爲什麼使用#define UIColor作爲CGColorRef會導致崩潰?

#define kCircleInnerShadowColor [UIColor colorWithWhite:.78 alpha:1.0] 

然後我用這樣的:

CGColorRef shadowColorRef = kCircleInnerShadowColor.CGColor; 
CGContextSetShadowWithColor(cxt, size, 0, shadowColorRef); 

然而,這導致BAD_ACCESS崩潰。如果我反而做

CGContextSetShadowWithColor(cxt, size, 0, kCircleInnerShadowColor.CGColor); 

我不會崩潰,它工作正常。這是什麼原因?

回答

3

它崩潰的原因是因爲範圍問題。 你在做什麼是:

  1. 創建一個新的UIColor對象
  2. 檢索其CGColor指針
  3. 把那個指針到一個新的變量
  4. 鬆開的UIColor對象(下一行...)
  5. 使用CGColor指針,它指向錯誤的數據已經

當您在「一行版」做到這一點,你做的是:

  1. 創建一個新的UIColor對象
  2. 檢索其CGColor指針
  3. 使用CGColor指針的函數
  4. 鬆開的UIColor對象(下一行...)

因此,因爲您在使用它的同一行中創建對象,編譯器會自動保留對象,直到函數調用返回並繼續到下一行。只有這樣它才能釋放對象。

但是,當您將CGColor設置爲變量時,會發生什麼情況是編譯器認爲該對象不會在任何地方使用,併發送一個版本。但CGColor不是NSObject,編譯器不會發送「保留」到CGColor。

如果您需要變量中的CGColor,您可能需要使用CGColorRetain

CGColorRef shadowColorRef = CGColorRetain(kCircleInnerShadowColor.CGColor); 

然後當你完成它,CGColorRelease

+2

這是有效的,「內部指針」的問題(正是因爲丹尼爾介紹)。如果使用這種顏色,一個可能更好的解決方案*很多*是有一個全局變量,而不是#define,以避免大量的內存流量。 – bbum

+0

如何創建全局UIColor變量? – Snowman

+0

哪一行是釋放CGColorRef? – Snowman

相關問題