与CGImageRef的NSArray有关的问题(但不在模拟器上!)

时间:2013-04-24 20:10:07

标签: ios nsarray cgimageref

我正在尝试将一些CGImageRefs放入NSArray中。它在模拟器上应该工作,但不在设备上 - 它在我尝试用EXC_BAD_ACCESS代码= 1错误形成数组时崩溃。我也尝试了其他的东西,比如从一个可变数组开始,但它也不起作用。在控制台中键入bt的结果是

(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形成一个只有一个字母imageref的可变数组时。即便如此,它只会有效,并且在我的程序中会进一步崩溃。

我似乎已经读过某些地方没有保留CGImageRef,因此在我开始使用之前它们可能会被释放。自从ARC开始介绍后我就开始编码了,我对释放知之甚少,因为它一直在模拟器上工作,我认为这不适用于我的情况。

此外,在此回复中:

How do I create a mutable array of CGImageRefs?

一位从事Cocoa Frameworks工作的人表示,尽管他没有提供任何具体细节,但它应该有效,因此可能是隐含的。

非常感谢任何帮助和建议。

编辑已解决 似乎问题确实是当我尝试将它们添加到数组时,imagerefs不存在,这是因为它们已经被释放了。显然他们需要使用CGImageRetain保留。它现在有效,我只需要确保它们随后被释放。

1 个答案:

答案 0 :(得分:0)

解决方案是在我有时间使用它们之前就已经释放了图像效果。它似乎会立即发生(至少在设备上),除非使用CGImageRetain保留它们。