2

我正在尝试将一些 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

所以基本上我有很多图像,字母,我有很多层代表单词中的位置,每个层都应该循环遍历它们。例如,图层 1 显示字母 C,然后是字母 F,然后是字母 P 等,而图层 2 显示其他序列。

我以为我会加载每个字母一次...

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 后开始编码以来,我对发布知之甚少,而且由于它一直在模拟器上工作,我认为这不适用于我的情况。

另外,在这个回复中:

如何创建一个可变的 CGImageRefs 数组?

一个在 Cocoa Frameworks 上工作的人说它应该可以工作,尽管他没有给出任何细节,所以它可能是暗示的。

任何帮助和建议将不胜感激。

编辑已解决 似乎问题确实是当我尝试将它们添加到数组时图像引用不存在,这是因为它们已经被释放了。显然他们需要使用 CGImageRetain 来保留。它现在可以工作了,我只需要确保它们在之后被释放。

4

1 回答 1

0

解决方案是在我还没来得及使用它们之前就发布了 imagerefs。似乎这会立即发生(至少在设备上),除非它们使用 CGImageRetain 保留。

于 2013-04-26T13:38:42.007 回答