2013-04-24 45 views
2

我想把幾個CGImageRefs放入一個NSArray。它的工作原理應該是在模擬器上,但不是在設備上 - 它在我試圖用EXC_BAD_ACCESS code = 1錯誤形成陣列時崩潰。我也試過其他的東西,比如從一個可變數組開始,但它也不起作用。在控制檯中輸入BT的結果是CGImageRef的NSArray的問題(​​但不是在模擬器上!)

(lldb) bt 
* thread #1: tid = 0x2403, 0x3a9b25b6 libobjc.A.dylib`objc_msgSend + 22, stop reason = EXC_BAD_ACCESS (code=1, address=0x86ea78f7) 
frame #0: 0x3a9b25b6 libobjc.A.dylib`objc_msgSend + 22 
frame #1: 0x32a98b5e CoreFoundation`+[__NSArrayI __new:::] + 58 
frame #2: 0x00042388 NameOfMyApp 

所以基本上我有很多圖片的信件,的,我有代表字位置的層數應在每個週期通過他們。例如,layer1顯示letterC,然後顯示letterF,然後顯示letterP等,而layer2顯示其他順序。

我想我會加載每個字母一次......

CGImageRef letterH = [UIImage imageWithContentsOfFile:letterHfilename].CGImage; 
CGImageRef letterI = [UIImage imageWithContentsOfFile:letterIfilename].CGImage; 

...並把CGImageRefs在一個NSArray財產,強制轉換爲ID:

self.titleLetters = @[(__bridge id)letterH, (__bridge id)letterI; 

我後來做另一個數組中

layerN.contents = self.titleLetters[i]; 

,但更重要的是我必須能夠把他們(每個可能的時間):

[contentsValuesArray addObject:self.titleLetters[j]]; 

,然後使用該陣列作爲keyFrameAnimation的值:

CAKeyframeAnimation* contentsAnim = [CAKeyframeAnimation animationWithKeyPath:@"contents"]; 
contentsAnim.values = contentsValuesArray; 

所有這每次工作正常在模擬器。

正如我所說的,我嘗試了一些變化,並且似乎工作的唯一情況是當我使用arrayWithObject形成一個只有一個letter-imageref的可變數組時。即使那樣,它也只是有效,它在我的程序中進一步崩潰。

我似乎已經讀過CGImageRefs沒有保留的地方,這樣它們可能會在我使用它們之前被釋放。自從ARC開始編寫代碼以來,我對釋放知之甚少,因爲它一直在模擬器上工作,所以我認爲這不適用於我的情況。

而且,在此回覆:

How do I create a mutable array of CGImageRefs?

在Cocoa框架中工作的人說,它應該工作,雖然他沒有給出任何細節,所以它可能是暗示。

任何幫助和建議,將不勝感激。

編輯解決 看來,這個問題的確,當我試圖將它們添加到陣列的imagerefs是不存在的,這是因爲他們已經被釋放了。顯然他們需要使用CGImageRetain來保留。它現在可以工作,我只需要確保它們在事後發佈。

+2

任何你不能簡單地使用UIImages的原因? – DarkDust 2013-04-24 20:13:09

+1

你從來沒有真正說過(除非它是在最後幾段中不必要的長),實際上失敗以及如何。 – 2013-04-24 20:18:53

+0

@熱舔,我不知道什麼是失敗,但正如我在合理簡短的第一段中說,它當我嘗試做self.titleLetters =(橋接CGImageRefs數組)時崩潰。我只是在這個xcode視圖中看起來像機器代碼或其他東西,對我來說完全沒有意義,而且我找不到任何可讀的解釋。 – Gusutafu 2013-04-24 20:27:13

回答

0

解決方案是,imagerefs在我有時間使用它們之前就已經發布了。看起來這是直接發生的(至少在設備上),除非它們使用CGImageRetain保留。

相關問題